-
Notifications
You must be signed in to change notification settings - Fork 24
/
Mailbox.cljs
28 lines (25 loc) · 835 Bytes
/
Mailbox.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(ns missionary.impl.Mailbox
(:import missionary.Cancelled))
(defn nop [])
(deftype Port [^:mutable enqueue
^:mutable dequeue
^:mutable readers]
IFn
(-invoke [_ t]
(if-some [[!] (seq readers)]
(do (set! readers (disj readers !)) (! t))
(do (.push enqueue t) nil)))
(-invoke [_ s! f!]
(if (zero? (alength dequeue))
(if (zero? (alength enqueue))
(let [! #(s! %)]
(set! readers (conj readers !))
#(when (contains? readers !)
(set! readers (disj readers !))
(f! (Cancelled. "Mailbox fetch cancelled."))))
(let [tmp enqueue]
(set! enqueue dequeue)
(set! dequeue (.reverse tmp))
(s! (.pop tmp)) nop))
(do (s! (.pop dequeue)) nop))))
(defn make [] (->Port (array) (array) #{}))