Skip to content

Instantly share code, notes, and snippets.

@martintrojer
Last active December 19, 2015 21:19
Show Gist options
  • Save martintrojer/6019215 to your computer and use it in GitHub Desktop.
Save martintrojer/6019215 to your computer and use it in GitHub Desktop.
core.async non-tailrecursive
(defn walk [tree ch]
(letfn [(walker [t]
(go
(when t
(walker (:left t))
(>! ch (:value t))
(walker (:right t)))))]
(walker tree)
(close! ch)))
(defn walk [tree ch]
(letfn [(walker [t]
(go
(when t
(walker (:left t))
(>! ch (:value t))
(walker (:right t)))))]
(go
(<! (walker tree))
(close! ch))))
(defn walk [tree ch]
(letfn [(walker [t]
(go
(when t
(<! (walker (:left t)))
(>! ch (:value t))
(<! (walker (:right t))))))]
(go
(<! (walker tree))
(close! ch))))
(defn walk [tree ch]
(go
((fn walker [t]
(when t
(walker (:left t))
(>! ch (:value t))
(walker (:right t))))
tree)
(close! ch)))
(defn walk [tree ch]
(letfn [(walker [t]
(when t
(walker (:left t))
(>!! ch (:value t))
(walker (:right t))))]
(walker tree)
(close! ch)))
(defn put-all! [vs ch]
(doseq [v vs] (>! ch v)))
(let [ch (chan)]
(go (put-all! [42 84] ch))
[(<!! ch) (<!! ch)])
(let [ch (chan)]
(go ((fn [vs] (doseq [v vs] (>! ch v)))
[42 84]))
[(<!! ch) (<!! ch)])
(let [ch (chan)]
(go (doseq [v [42 84]] (>! ch v)))
[(<!! ch) (<!! ch)])
(let [ch (chan)]
(go (loop [[f & r] [42 84]] ;; equivalent to (doseq)
(when f (>! ch f) (recur r))))
[(<!! ch) (<!! ch)])
(defn same [t1 t2]
(let [ch1 (chan)
ch2 (chan)
drain #(loop [v (<!! %) res []]
(if v (recur (<!! %) (conj res v)) res))]
(thread (walk t1 ch1))
(thread (walk t2 ch2))
(= (drain ch1) (drain ch2))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment