0 | module System.UV.Idle
 1 |
 2 | import IO.Async
 3 | import IO.Async.Event
 4 | import System.UV.Loop
 5 | import System.UV.Pointer
 6 | import System.UV.Raw.Handle
 7 | import System.UV.Raw.Idle
 8 |
 9 | %default total
10 |
11 | %inline stopIdle : HasIO io => Ptr Idle -> io ()
12 | stopIdle = ignore . uv_idle_stop
13 |
14 | %inline stopCheck : HasIO io => Ptr Check -> io ()
15 | stopCheck = ignore . uv_check_stop
16 |
17 | %inline stopPrepare : HasIO io => Ptr Prepare -> io ()
18 | stopPrepare = ignore . uv_prepare_stop
19 |
20 | parameters {auto cc : CloseCB}
21 |   export %inline
22 |   Resource (Ptr Idle) where
23 |     release p = stopIdle p >> uv_close p cc
24 |
25 |   export %inline
26 |   Resource (Ptr Check) where
27 |     release p = stopCheck p >> uv_close p cc
28 |
29 |   export %inline
30 |   Resource (Ptr Prepare) where
31 |     release p = stopPrepare p >> uv_close p cc
32 |
33 | parameters {auto l   : UVLoop}
34 |            {auto has : Has UVError es}
35 |
36 |   export
37 |   mkIdle : Async es (Ptr Idle)
38 |   mkIdle = mallocPtr Idle >>= uvAct (uv_idle_init l.loop)
39 |
40 |   ||| Runs the given `IO` action during the "idle" phase of the event loop.
41 |   export
42 |   onIdle : (Event Nat -> Async es a) -> Async es a
43 |   onIdle run =
44 |     use1 mkIdle $ \pt => do
45 |       ev <- newEvent
46 |       uv $ uv_idle_start pt (\_ => send ev 1 id (+))
47 |       run ev
48 |