0 | module IO.Async.Logging
3 | import Derive.Prelude
6 | %language ElabReflection
9 | data LogLevel = Trace | Debug | Info | Warn | Error | Fatal
11 | %runElab derive "LogLevel" [Show,Eq,Ord]
14 | Interpolation LogLevel where interpolate = toLower . show
17 | record Logger (0 e : Type) where
18 | constructor MkLogger
19 | logML : LogLevel -> Lazy (List String) -> Async e [] ()
23 | filter : LogLevel -> Logger e -> Logger e
24 | filter lvl x = MkLogger $
\l,s => case l >= lvl of
29 | Semigroup (Logger e) where
30 | x <+> y = MkLogger $
\l,s => x.logML l s >> y.logML l s
33 | Monoid (Logger e) where
34 | neutral = MkLogger $
\_,_ => pure ()
36 | parameters {auto lg : Logger e}
39 | logML : LogLevel -> Lazy (List String) -> Async e es ()
40 | logML l ss = weakenErrors $
lg.logML l ss
43 | log : LogLevel -> Lazy String -> Async e es ()
44 | log l s = logML l [s]
47 | trace : Lazy String -> Async e es ()
51 | debug : Lazy String -> Async e es ()
55 | info : Lazy String -> Async e es ()
59 | warn : Lazy String -> Async e es ()
63 | error : Lazy String -> Async e es ()
67 | fatal : Lazy String -> Async e es ()
71 | traceML : Lazy (List String) -> Async e es ()
72 | traceML = logML Trace
75 | debugML : Lazy (List String) -> Async e es ()
76 | debugML = logML Debug
79 | infoML : Lazy (List String) -> Async e es ()
83 | warnML : Lazy (List String) -> Async e es ()
87 | errorML : Lazy (List String) -> Async e es ()
88 | errorML = logML Error
91 | fatalML : Lazy (List String) -> Async e es ()
92 | fatalML = logML Fatal
95 | ierror : Interpolation a => a -> Async e es ()
96 | ierror x = error (interpolate x)
99 | ifatal : Interpolation a => a -> Async e es ()
100 | ifatal x = fatal (interpolate x)
107 | interface Loggable e t where
108 | logLoggable : {0 es : _} -> t -> Async e es ()
110 | parameters {0 es : List Type}
111 | {auto lgs : All (Loggable e) es}
114 | unerr : (dflt : t) -> Async e es t -> Async e [] t
115 | unerr dflt = handle (mapProperty (\_,v => logLoggable v $> dflt) lgs)
118 | unerrMaybe : Async e es t -> Async e [] (Maybe t)
119 | unerrMaybe = unerr Nothing . map Just
122 | logErrs : Async e es () -> Async e [] ()