2014-12-15 11:56:32 +00:00
|
|
|
(ns re-frame.subs
|
|
|
|
(:require
|
2015-04-17 13:51:29 +00:00
|
|
|
[reagent.ratom :refer [make-reaction]]
|
|
|
|
[re-frame.db :refer [app-db]]
|
2015-05-02 00:48:31 +00:00
|
|
|
[re-frame.utils :refer [first-in-vector warn error]]))
|
2014-12-15 11:56:32 +00:00
|
|
|
|
|
|
|
|
2015-02-22 11:28:40 +00:00
|
|
|
;; maps from handler-id to handler-fn
|
2014-12-15 11:56:32 +00:00
|
|
|
(def ^:private key->fn (atom {}))
|
|
|
|
|
|
|
|
|
2015-04-24 23:50:46 +00:00
|
|
|
(defn clear-handlers!
|
|
|
|
"Unregister all subscription handlers"
|
|
|
|
[]
|
|
|
|
(reset! key->fn {}))
|
|
|
|
|
|
|
|
|
2014-12-15 11:56:32 +00:00
|
|
|
(defn register
|
2015-02-22 11:28:40 +00:00
|
|
|
"register a hander function for an id"
|
2014-12-15 11:56:32 +00:00
|
|
|
[key-v handler-fn]
|
|
|
|
(if (contains? @key->fn key-v)
|
2015-02-24 21:26:47 +00:00
|
|
|
(warn "re-frame: overwriting subscription-handler for: " key-v)) ;; allow it, but warn.
|
2014-12-15 11:56:32 +00:00
|
|
|
(swap! key->fn assoc key-v handler-fn))
|
|
|
|
|
|
|
|
|
|
|
|
(defn subscribe
|
2015-03-04 23:40:21 +00:00
|
|
|
"returns a reagent/reaction which observes a part of app-db"
|
2014-12-15 11:56:32 +00:00
|
|
|
[v]
|
|
|
|
(let [key-v (first-in-vector v)
|
2015-02-24 21:26:47 +00:00
|
|
|
handler-fn (get @key->fn key-v)]
|
2015-02-22 11:28:40 +00:00
|
|
|
(if (nil? handler-fn)
|
2015-05-02 00:48:31 +00:00
|
|
|
(error "re-frame: no subscription handler registered for: \"" key-v "\". Returning a nil subscription.")
|
2015-02-22 11:28:40 +00:00
|
|
|
(handler-fn app-db v))))
|
2015-04-17 13:51:29 +00:00
|
|
|
|