Skip to content

Instantly share code, notes, and snippets.

@fredyr
Last active December 15, 2015 18:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fredyr/5304971 to your computer and use it in GitHub Desktop.
Save fredyr/5304971 to your computer and use it in GitHub Desktop.
Event source hack
(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