0 | module System.UV.Loop
3 | import IO.Async.Token
7 | import System.UV.Raw.Async
8 | import System.UV.Raw.Handle
9 | import System.UV.Raw.Loop
10 | import System.UV.Raw.Pointer
12 | import public IO.Async
13 | import public System.UV.Data.Error
14 | import public System.UV.Data.RunMode
26 | ref : IORef (SnocList $
IO ())
29 | export %inline %hint
30 | loopCtxt : UVLoop => ExecutionContext
34 | (\x => modifyIORef l.ref (:< x) >> ignore (uv_async_send l.async))
37 | export %inline %hint
38 | loopCloseCB : UVLoop => CloseCB
39 | loopCloseCB @{l} = l.cc
43 | defaultLoop : IO UVLoop
45 | l <- uv_default_loop
47 | ref <- newIORef {a = SnocList $
IO ()} [<]
49 | pa <- mallocPtr Async
51 | let loop := MkLoop l pa tg cc ref 100
53 | r2 <- uv_async_init l pa $
\x => do
56 | sequence_ (ss <>> [])
59 | parameters {auto has : Has UVError es}
62 | uvCheck : a -> Int32 -> Result es a
63 | uvCheck v n = if n < 0 then Left (inject $
fromCode n) else Right v
66 | uvRes : Int32 -> Result es ()
70 | uv : IO Int32 -> Async es ()
71 | uv = sync . map uvRes
74 | uvAct : Resource a => (a -> IO Int32) -> a -> Async es a
75 | uvAct f v = onAbort (uv $
f v) (release v) $> v
80 | -> (cancel : r -> Async [] ())
81 | -> (free : r -> Async [] ())
82 | -> (r -> (a -> IO ()) -> IO Int32)
84 | uvCancelableAsync ptr cancel free reg =
87 | (\p => cancelableAsync $
\cb => do
88 | n <- reg p (cb . Succeeded)
90 | Left err => cb (Error err) $> pure ()
91 | Right () => pure (cancel p)
96 | uvAsync : ((Outcome es a -> IO ()) -> IO Int32) -> Async es a
101 | Left err => cb (Error err)
102 | Right () => pure ()
105 | Resource CloseCB where
106 | release = freeCloseCB
111 | runUV : (UVLoop => Async [] ()) -> IO ()
113 | loop <- defaultLoop
114 | runAsync $
finally (act @{loop}) (liftIO $
uv_close loop.async loop.cc)
115 | res <- uv_run loop.loop (toCode Default)
116 | case uvRes {es = [UVError]} res of
117 | Left (Here err) => die "\{err}"