Skip to content

Instantly share code, notes, and snippets.

@danielneal
Created March 1, 2019 17:01
Show Gist options
  • Save danielneal/47b039b7c3e0638d5f28ead07f3e637e to your computer and use it in GitHub Desktop.
Save danielneal/47b039b7c3e0638d5f28ead07f3e637e to your computer and use it in GitHub Desktop.
hooks
(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