Skip to content

Instantly share code, notes, and snippets.

@kachayev
Last active December 20, 2015 12:39
Show Gist options
  • Save kachayev/6132477 to your computer and use it in GitHub Desktop.
Save kachayev/6132477 to your computer and use it in GitHub Desktop.
(require '[clojure.core.async
:as async
:refer [<! >! <!! timeout chan alt! go]])
(defn fake-search [kind]
(fn [c query]
(go
(<! (timeout (rand-int 100)))
(>! c [kind query]))))
(def web1 (fake-search :web1))
(def web2 (fake-search :web2))
(def image1 (fake-search :image1))
(def image2 (fake-search :image2))
(def video1 (fake-search :video1))
(def video2 (fake-search :video2))
(defn fastest [query & replicas]
(let [c (chan)]
(doseq [replica replicas]
(replica c query))
c))
(defn google [query]
(let [c (chan)
t (timeout 80)]
(go (>! c (<! (fastest query web1 web2))))
(go (>! c (<! (fastest query image1 image2))))
(go (>! c (<! (fastest query video1 video2))))
(go (loop [i 0 ret []]
(if (= i 3)
ret
(recur (inc i)
(conj ret
(alt! [c t] ([v] v)))))))))
(<!! (google "clojure"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment