Skip to content

Instantly share code, notes, and snippets.

@Jell
Forked from fredyr/es.clj
Last active December 15, 2015 20:41
Show Gist options
  • Save Jell/5320521 to your computer and use it in GitHub Desktop.
Save Jell/5320521 to your computer and use it in GitHub Desktop.
(def game-results {:rock {:rock :tie, :paper :lose, :scissor :win}
:paper {:rock :win, :paper :tie, :scissor :lose}
:scissor {:rock :lose, :paper :win, :scissor :tie}})
(defn create-game-command
[{:keys [aggregate-id player move]} state]
[{:event :game-created
:game-id aggregate-id
:creator player
:state-change {:state :started :creator player}}
{:event :move-decided
:game-id aggregate-id
:player player
:move move
:state-change {:move move}}])
(defn decide-move-command
[{:keys [aggregate-id player move]} {creator :creator first-move :move}]
(let [results-mapping {:win {:event :game-won
:game-id aggregate-id
:winner creator
:loser player
:state-change {:state :finished}}
:lose {:event :game-won
:game-id aggregate-id
:winner player
:loser creator
:state-change {:state :finished}}
:tie {:event :game-tie
:game-id aggregate-id
:state-change {:state :finished}}}
result (-> game-results first-move move)]
[{:event :move-decided
:game-id aggregate-id
:player player
:move move
:state-change {:move move}}
(result results-mapping)]))
(defn apply-events [events state]
(reduce merge state (map :state-change events)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment