Aleph: a Framework for Asynchronous Communication4. > (def ch (channel))
<== []
> (enqueue ch 1)
true
> (enqueue ch 2 3)
true
5. > (def ch (channel))
<== []
> (enqueue ch 1)
true
> (enqueue ch 2 3)
true
> (receive ch #(println "received" %))
received 1
true
6. > (def ch (channel))
<== []
> (receive ch #(println "callback a:" %))
true
> (receive ch #(println "callback b:" %))
true
> (enqueue ch 1)
callback a: 1
callback b: 1
true
7. > (def ch (channel 1 2))
<== [1 2]
> (receive-all ch #(println %))
1
2
true
> (enqueue ch 3)
3
true
11. A simple echo server
(defn setup-echo [ch]
(receive-all ch #(enqueue ch %))
or
(defn setup-echo [ch]
(siphon ch ch))
12. A restatement of the problem
• We want the latest changelist from the server
• If a new changelist is available, respond
immediately
• Otherwise, delay the response until a new
changelist comes in
14. (def latest (ref nil))
(def changelists (channel))
(receive-all changelists
(fn [changelist]
(dosync
(ref-set latest changelist))))
15. (def latest (ref nil))
(def changelists (channel))
(receive-all changelists
(fn [changelist]
(dosync
(ref-set latest changelist))))
(defn request-handler [response-channel request]
(let [last-serial (-> request :body :last-serial)
src (dosync
(if (and @latest (> (:serial latest) last-serial))
(channel @latest)
(take* 1 changelists)))]
(siphon
(map* create-http-response src)
response-channel)))