(defmacro wait
"Sleep
timeout
seconds before evaluating body"
[timeout & body]
`(do (Thread/sleep ~timeout) ~@body))
(defmacro enqueue
([q concurrent-promise-name concurrent serialized]
`(let [~concurrent-promise-name (promise)]
(future (deliver ~concurrent-promise-name ~concurrent))
(deref ~q)
~serialized
~concurrent-promise-name))
([concurrent-promise-name concurrent serialized]
`(enqueue (future) ~concurrent-promise-name ~concurrent ~serialized)))
(time @(-> (enqueue saying (wait 200 "'Ello, gov'na!") (println
@saying))
(enqueue saying (wait 400 "Pip pip!") (println
@saying))
(enqueue saying (wait 100 "Cheerio!") (println
@saying))))
; => 'Ello, gov'na!
; => Pip pip!
; => Cheerio!
; => "Elapsed time: 401.635 msecs"