Skip to content

Instantly share code, notes, and snippets.

@jaen
Created December 9, 2015 13:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jaen/027660fbf55bfff6241f to your computer and use it in GitHub Desktop.
Save jaen/027660fbf55bfff6241f to your computer and use it in GitHub Desktop.
(ns scrabble.backend.components.logic
(:require [com.stuartsierra.component :as component]
[taoensso.timbre :as log]
[scrabble.backend.logic.logic :as logic])
(:import [clojure.lang MultiFn]))
(defn make-dispatch-method []
(new MultiFn "scrabble.backend.components.logic/logic-dispatch-method"
(fn [_ {:keys [:event/type :event/version]}]
[type version])
:default
#'clojure.core/global-hierarchy))
(defrecord Logic [repository dispatch-method users]
component/Lifecycle
(start [component]
(let [dispatch-method (make-dispatch-method)
handlers (seq (logic/-get-event-handlers users))]
(doseq [[dispatch-value handler] handlers]
(log/debug "Registering event handler for" dispatch-value)
(.addMethod ^MultiFn dispatch-method dispatch-value handler))
(assoc component :dispatch-method dispatch-method)))
(stop [component]
(dissoc component :dispatch-method))
logic/Logic
(-apply-event [this aggregate event]
(dispatch-method aggregate event)))
(defn make [& [options]]
(map->Logic {}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment