6 | module Data.Linear.Deferred
8 | import public Data.Linear.Token
9 | import Data.Linear.Ref1
10 | import Data.Linear.Traverse1
11 | import Data.Linear.Unique
12 | import Data.SortedMap
21 | data ST1 : Type -> Type -> Type where
23 | Val1 : (v : a) -> ST1 s a
24 | Obs1 : (cb : a -> F1' s) -> ST1 s a
33 | record Once s a where
35 | ref : Ref s (ST1 s a)
39 | once1 : F1 s (Once s a)
40 | once1 t = let ref # t := ref1 Ini1 t in O ref # t
45 | onceOf1 : (0 a : _) -> F1 s (Once s a)
50 | completedOnce1 : Once s a -> F1 s Bool
51 | completedOnce1 (O r) t =
52 | let Val1 _ # t := read1 r t | _ # t => False # t
58 | peekOnce1 : Once s a -> F1 s (Maybe a)
59 | peekOnce1 (O ref) t =
60 | let Val1 x # t := read1 ref t | _ # t => Nothing # t
69 | putOnce1 : Once s a -> (v : a) -> F1' s
70 | putOnce1 (O ref) v t = assert_total $
let x # t := read1 ref t in go x x t
73 | go : ST1 s a -> ST1 s a -> F1' s
75 | case caswrite1 ref x (Val1 v) t of
77 | _ # t => putOnce1 (O ref) v t
78 | go x (Val1 _) t = () # t
80 | case caswrite1 ref x (Val1 v) t of
82 | _ # t => putOnce1 (O ref) v t
84 | unobs : Once s a -> F1' s
86 | assert_total $
let x # t := read1 ref t in go x x t
88 | go : ST1 s a -> ST1 s a -> F1' s
90 | case caswrite1 ref x Ini1 t of
92 | _ # t => unobs (O ref) t
108 | observeOnce1 : Once s a -> (a -> F1' s) -> F1 s (F1' s)
109 | observeOnce1 (O ref) cb t = assert_total $
let x # t := read1 ref t in go x x t
111 | go : ST1 s a -> ST1 s a -> F1 s (F1' s)
112 | go x (Val1 v) t = let _ # t := cb v t in unit1 # t
114 | case caswrite1 ref x (Obs1 cb) t of
115 | True # t => unobs (O ref) # t
116 | _ # t => observeOnce1 (O ref) cb t
117 | go x _ t = unit1 # t
124 | data ST : Type -> Type -> Type where
125 | Val : (v : a) -> ST s a
126 | Obs : (cbs : SortedMap (Token s) (a -> F1' s)) -> ST s a
132 | record Deferred s a where
134 | ref : Ref s (ST s a)
138 | deferred1 : F1 s (Deferred s a)
139 | deferred1 t = let ref # t := ref1 (Obs empty) t in D ref # t
144 | deferredOf1 : (0 a : _) -> F1 s (Deferred s a)
145 | deferredOf1 _ = deferred1
149 | completed1 : Deferred s a -> F1 s Bool
150 | completed1 (D r) t =
151 | let Val _ # t := read1 r t | _ # t => False # t
157 | peekDeferred1 : Deferred s a -> F1 s (Maybe a)
158 | peekDeferred1 (D ref) t =
159 | let Val x # t := read1 ref t | _ # t => Nothing # t
167 | putDeferred1 : Deferred s a -> (v : a) -> F1' s
168 | putDeferred1 (D r) v t = assert_total $
let x # t := read1 r t in go x x t
171 | go : ST s a -> ST s a -> F1' s
172 | go x (Val _) t = () # t
174 | let True # t := caswrite1 r x (Val v) t | _ # t => putDeferred1 (D r) v t
175 | in traverse1_ (\cb => cb v) (Prelude.toList cbs) t
177 | unobsDef : Deferred s a -> Token s -> F1 s ()
178 | unobsDef (D r) tok t = assert_total $
let x # t := read1 r t in go x x t
180 | go : ST s a -> ST s a -> F1' s
181 | go x (Val _) t = () # t
183 | case caswrite1 r x (Obs $
delete tok cbs) t of
185 | _ # t => unobsDef (D r) tok t
196 | observeDeferredAs1 : Deferred s a -> Token s -> (a -> F1' s) -> F1 s (F1' s)
197 | observeDeferredAs1 (D r) tok cb t =
198 | assert_total $
let x # t := read1 r t in go x x t
200 | go : ST s a -> ST s a -> F1 s (F1' s)
201 | go x (Val v) t = let _ # t := cb v t in unit1 # t
203 | case caswrite1 r x (Obs $
insert tok cb cbs) t of
204 | True # t => unobsDef (D r) tok # t
205 | _ # t => observeDeferredAs1 (D r) tok cb t
215 | observeDeferred1 : Deferred s a -> (a -> F1' s) -> F1 s (F1' s)
216 | observeDeferred1 def cb t =
217 | let tok # t := token1 t
218 | in observeDeferredAs1 def tok cb t
226 | once : Lift1 s f => f (Once s a)
231 | onceOf : Lift1 s f => (0 a : _) -> f (Once s a)
236 | peekOnce : Lift1 s f => Once s a -> f (Maybe a)
237 | peekOnce o = lift1 $
peekOnce1 o
241 | completedOnce : Lift1 s f => Once s a -> f Bool
242 | completedOnce d = lift1 $
completedOnce1 d
247 | putOnce : Lift1 s f => Once s a -> (v : a) -> f ()
248 | putOnce o v = lift1 $
putOnce1 o v
252 | completed : Lift1 s f => Deferred s a -> f Bool
253 | completed d = lift1 $
completed1 d
257 | deferred : Lift1 s f => f (Deferred s a)
258 | deferred = lift1 deferred1
262 | deferredOf : Lift1 s f => (0 a : _) -> f (Deferred s a)
263 | deferredOf _ = deferred
267 | peekDeferred : Lift1 s f => Deferred s a -> f (Maybe a)
268 | peekDeferred d = lift1 $
peekDeferred1 d
272 | putDeferred : Lift1 s f => Deferred s a -> (v : a) -> f ()
273 | putDeferred d v = lift1 $
putDeferred1 d v