0 | module IO.Async.Event
4 | import System.Concurrency
11 | cb : IORef (Maybe (a -> IO ()))
12 | ref : IORef (Maybe a)
15 | withLock : Event a -> IO b -> IO b
17 | mutexAcquire ev.lock
19 | mutexRelease ev.lock
23 | newEvent : HasIO io => io (Event a)
24 | newEvent = [| Ev (newIORef Nothing) (newIORef Nothing) makeMutex |]
27 | listen : Event a -> (a -> IO ()) -> IO ()
29 | run <- withLock ev $
do
30 | readIORef ev.ref >>= \case
31 | Just v => writeIORef ev.ref Nothing $> cb v
32 | Nothing => writeIORef ev.cb (Just cb) $> pure ()
36 | send : Event a -> b -> (b -> a) -> (a -> b -> a) -> IO ()
37 | send ev v new acc = do
38 | run <- withLock ev $
39 | readIORef ev.cb >>= \case
40 | Nothing => readIORef ev.ref >>= \case
41 | Just x => writeIORef ev.ref (Just $
acc x v) $> pure ()
42 | Nothing => writeIORef ev.ref (Just $
new v) $> pure ()
43 | Just cb => writeIORef ev.cb Nothing $> cb (new v)
46 | stopListening : Event a -> IO ()
47 | stopListening ev = withLock ev $
writeIORef ev.cb Nothing
50 | onEvent : Event a -> Async es a
52 | cancelableAsync $
\cb =>
53 | listen ev (cb . Succeeded) $> liftIO (stopListening ev)
56 | 0 Buffer : Type -> Type
57 | Buffer = Event . SnocList
60 | buffer : Buffer a -> a -> IO ()
61 | buffer ev v = send ev v (Lin :<) (:<)