-
Notifications
You must be signed in to change notification settings - Fork 24
/
Rendezvous.cljs
29 lines (26 loc) · 889 Bytes
/
Rendezvous.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
29
(ns missionary.impl.Rendezvous
(:import missionary.Cancelled))
(defn nop [])
(deftype Port [^:mutable readers
^:mutable writers]
IFn
(-invoke [_ t]
(fn [s! f!]
(if-some [[!] (seq readers)]
(do (set! readers (disj readers !))
(! t) (s! nil) nop)
(let [! #(s! nil)]
(set! writers (assoc writers ! t))
#(when (contains? writers !)
(set! writers (dissoc writers !))
(f! (Cancelled. "Rendez-vous give cancelled.")))))))
(-invoke [_ s! f!]
(if-some [[[! t]] (seq writers)]
(do (set! writers (dissoc writers !))
(!) (s! t) nop)
(let [! #(s! %)]
(set! readers (conj readers !))
#(when (contains? readers !)
(set! readers (disj readers !))
(f! (Cancelled. "Rendez-vous take cancelled.")))))))
(defn make [] (->Port #{} {}))