0 | module Data.MSF.Running
2 | import Control.Monad.Identity
3 | import Data.Contravariant
17 | step : Monad m => MSF m i o -> i -> m (o, MSF m i o)
19 | par : Monad m => ParList m is os -> HList is -> m (HList os, ParList m is os)
20 | par [] [] = pure ([],[])
21 | par (sf :: sfs) (vi :: vis) = do
22 | (vo, sf2) <- step sf vi
23 | (vos, sfs2) <- par sfs vis
24 | pure (vo :: vos, sf2 :: sfs2)
26 | fan : Monad m => FanList m i os -> i -> m (HList os, FanList m i os)
27 | fan [] _ = pure ([],[])
28 | fan (sf :: sfs) vi = do
29 | (vo, sf2) <- step sf vi
30 | (vos, sfs2) <- fan sfs vi
31 | pure (vo :: vos, sf2 :: sfs2)
33 | choice : Monad m => ParList m is os -> HSum is -> m (HSum os, ParList m is os)
34 | choice (sf :: sfs) (Here vi) = do
35 | (vo, sf2) <- step sf vi
36 | pure (Here vo, sf2 :: sfs)
38 | choice (sf :: sfs) (There y) = do
39 | (vo, sfs2) <- choice sfs y
40 | pure (There vo, sf :: sfs2)
42 | collect : Monad m => CollectList m is o -> HSum is -> m (o, CollectList m is o)
43 | collect (sf :: sfs) (Here vi) = do
44 | (vo, sf2) <- step sf vi
45 | pure (vo, sf2 :: sfs)
47 | collect (sf :: sfs) (There y) = do
48 | (vo, sfs2) <- collect sfs y
49 | pure (vo, sf :: sfs2)
51 | step c@(Const x) _ = pure (x, c)
52 | step Id v = pure (v, Id)
53 | step c@(Arr f) v = pure (f v, c)
54 | step c@(Lifted f) v = (,c) <$> f v
56 | step (Seq sf1 sf2) v = do
57 | (vx,sf1') <- step sf1 v
58 | (vo,sf2') <- step sf2 vx
59 | pure (vo, Seq sf1' sf2')
61 | step (Par sfs) v = mapSnd Par <$> par sfs v
63 | step (Fan sfs) v = mapSnd Fan <$> fan sfs v
65 | step (Choice sfs) v = mapSnd Choice <$> choice sfs v
67 | step (Collect sfs) v = mapSnd Collect <$> collect sfs v
69 | step (Loop s sf) v = do
70 | ([s2,o], sf2) <- step sf [s,v]
71 | pure (o, Loop s2 sf2)
73 | step (Switch sf f) i = do
74 | (Left e,_) <- step sf i
75 | | (Right o,sf2) => pure (o, Switch sf2 f)
85 | embed : Monad m => List i -> MSF m i o -> m (List o)
86 | embed [] _ = pure []
87 | embed (vi :: is) sf = do
88 | (vo,sf2) <- step sf vi
94 | embedI : List i -> MSF Identity i o -> List o
95 | embedI is = runIdentity . embed is
101 | size : MSF m i o -> Nat
103 | sizePar : ParList m is os -> Nat
105 | sizePar (sf :: sfs) = size sf + sizePar sfs
107 | sizeFan : FanList m i os -> Nat
109 | sizeFan (sf :: sfs) = size sf + sizeFan sfs
111 | sizeCol : CollectList m is o -> Nat
113 | sizeCol (sf :: sfs) = size sf + sizeCol sfs
118 | size (Lifted f) = 1
119 | size (Seq x y) = 1 + size x + size y
120 | size (Par x) = 1 + sizePar x
121 | size (Fan x) = 1 + sizeFan x
122 | size (Choice x) = 1 + sizePar x
123 | size (Collect x) = 1 + sizeCol x
124 | size (Loop x y) = 1 + size y
125 | size (Switch x f) = 1 + size x
133 | record Handler (m : Type -> Type) (e : Type) where
136 | handle_ : e -> m ()
139 | Contravariant (Handler m) where
140 | contramap f (H g) = H $
g . f
143 | handle : {auto h : Handler m e} -> e -> m ()
155 | -> (initialEvent : Maybe e)
156 | -> (mkMSF : Handler m e -> m (MSF m e (), m ()))
158 | reactimate_ ie mkMSF = do
164 | hRef <- newIORef {a = e -> m ()} (const $
pure ())
167 | let h := H (\ve => readIORef hRef >>= \h => h ve)
174 | sfRef <- newIORef sf
180 | let realHandler : e -> m ()
181 | realHandler = \ev => do
182 | sf1 <- readIORef sfRef
183 | (_, sf2) <- step sf1 ev
184 | writeIORef sfRef sf2
188 | writeIORef hRef realHandler
191 | traverse_ h.handle_ ie
202 | reactimate : HasIO m => (Handler m e -> m (MSF m e (), m ())) -> m (m ())
203 | reactimate = reactimate_ Nothing
208 | reactimateIni : HasIO m => e -> (Handler m e -> m (MSF m e (), m ())) -> m (m ())
209 | reactimateIni = reactimate_ . Just