Created
March 1, 2019 17:01
-
-
Save danielneal/47b039b7c3e0638d5f28ead07f3e637e to your computer and use it in GitHub Desktop.
hooks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(def db (atom {:counter 0})) | |
(defmulti query (fn [db query-v] query-v)) | |
(defmethod query :default | |
[db query-v] | |
(cond | |
(keyword? query-v) (get db query-v) | |
(vector? query-v) (get-in db query-v) | |
(set? query-v) (select-keys db (into [] query-v)) | |
(map? query-v) (persistent! (reduce-kv (fn [m k v] | |
(assoc! m k (query (get db k) v))) | |
(transient {}) | |
query-v)))) | |
(defn <-query | |
[query-v] | |
(let [result (<-state (query @db query-v))] | |
(<-effect | |
(fn [] | |
(let [id (random-uuid)] | |
(add-watch db id | |
(fn [_ _ _ new-db] | |
(reset! result (query new-db query-v)))) | |
(fn [] | |
(remove-watch db id)))) | |
#js [query-v]) | |
result)) | |
(defmulti handle-event (fn [db event-v] (first event-v))) | |
(defmethod handle-event :default | |
[db event-v] | |
(let [[e1 e2 & more] event-v] | |
(cond | |
(and (keyword? e1) (fn? e2)) (apply update db e1 e2 more) | |
(and (vector? e1) (fn? e2)) (apply update-in db e1 e2 more) | |
(keyword? e1) (assoc db e1 e1) | |
(vector? e1) (assoc-in db e1 e2) | |
:else db))) | |
(defn dispatch! | |
[event-v] | |
(swap! db handle-event event-v)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment