3 | module Log4Types.Async
6 | import IO.Async.Channel
7 | import Log4Types.Core
13 | record AsyncConfig where
14 | constructor MkAsyncConfig
21 | defaultAsyncConfig : AsyncConfig
22 | defaultAsyncConfig = MkAsyncConfig 1024
25 | drain : LogAction IO msg -> Channel msg -> Async e [] ()
26 | drain underlying chan = do
27 | Just m <- receive chan
28 | | Nothing => pure ()
29 | liftIO (underlying <& m)
30 | drain underlying chan
41 | : (config : AsyncConfig)
42 | -> (underlying : LogAction IO msg)
43 | -> (LogAction (Async e []) msg -> Async e [] a)
45 | withAsyncLogger config underlying k = do
46 | chan <- channel config.capacity
47 | fib <- start (drain underlying chan)
48 | res <- k (MkLogAction $
\m => ignore (send chan m))