Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
history.cljs
(ns history
"Light wrappers and utils for js/history")
(defn back! [] (.back js/history))
(defn forward! [] (.forward js/history))
(defn go! [idx] (.go js/history idx))
(defn replace-state!
([state]
(replace-state! state (.-title js/document)))
([state title]
(.replaceState js/history state title))
([state title path]
(.replaceState js/history state title path)))
(defn push-state!
([state title]
(.pushState js/history state title))
([state title path]
(.pushState js/history state title path)))
(defn current-state
"Returns current JS value of history.state"
[]
(.-state js/history))
(def state
(let [clj-state #(js->clj (.-state js/history) :keywordize-keys true)]
(reify
IDeref
(-deref [_]
(clj-state))
IReset
(-reset! [_ v]
(replace-state! (clj->js v)))
ISwap
(-swap! [s f]
(-reset! s (f (clj-state))))
(-swap! [s f x]
(-reset! s (f (clj-state) x)))
(-swap! [s f x y]
(-reset! s (f (clj-state) x y)))
(-swap! [s f x y more]
(-reset! s (apply f (clj-state) x y more))))))

I really liked reading through this. It's remarkable how easy it is/seems to provide some idiomatic wrapper for Clojurescript around bare bones Javascript stuff like this! 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment