0 | module Language.Reflection.Logging
2 | import Control.Monad.Writer
3 | import public Data.So
4 | import public Data.String
6 | import public Language.Reflection
11 | interface LogPosition a where
12 | logPosition : a -> String
15 | data LogPositions : Type where
17 | (::) : LogPosition a => a -> LogPositions -> LogPositions
20 | Interpolation LogPositions where
21 | interpolate = joinBy " " . Prelude.toList . toList [<] where
22 | toList : SnocList String -> LogPositions -> SnocList String
24 | toList acc (x::xs) = toList (acc :< logPosition x) xs
27 | length : LogPositions -> Nat
29 | length (_::xs) = S $
length xs
43 | interface ElabLogLevels where
44 | toNatLevel : LogLevel -> Nat
45 | defaultLogLevel : LogLevel
47 | public export %defaulthint
48 | DefaultElabLogLevels : ElabLogLevels
49 | DefaultElabLogLevels = I where
50 | [I] ElabLogLevels where
51 | toNatLevel Warning = 0
53 | toNatLevel Details = 5
54 | toNatLevel FineDetails = 7
55 | toNatLevel Trace = 10
56 | toNatLevel DetailedTrace = 12
57 | toNatLevel Debug = 15
58 | toNatLevel DetailedDebug = 20
59 | defaultLogLevel = Trace
62 | interface Monad m => MonadLog (0 m : Type -> Type) where
63 | constructor MkMonadLog
64 | logPoint : ElabLogLevels =>
65 | (level : LogLevel) ->
66 | (topic : String) -> So (topic /= "") =>
67 | (positions : LogPositions) ->
72 | logPoint' : MonadLog m =>
74 | (topic : String) -> So (topic /= "") =>
75 | (positions : LogPositions) ->
78 | logPoint' = logPoint defaultLogLevel
81 | withLogPoint : MonadLog m =>
83 | (level : LogLevel) ->
84 | (topic : String) -> So (topic /= "") =>
85 | (positions : LogPositions) ->
88 | withLogPoint l t p d x = logPoint l t p d >> x
91 | logValue : MonadLog m =>
93 | (level : LogLevel) ->
94 | (topic : String) -> So (topic /= "") =>
95 | (positions : LogPositions) ->
98 | logValue l t p d x = logPoint l t p d $> x
101 | logBounds : MonadLog m =>
103 | (level : LogLevel) ->
104 | (topic : String) -> So (topic /= "") =>
105 | (positions : LogPositions) ->
108 | logBounds level topic positions action = do
109 | let ticksCnt = (4 `minus` length positions) `max` 1
111 | let startFence = replicate ticksCnt '_'
112 | let startMark = "\{startFence} start \{startFence}"
114 | let endFence = replicate ticksCnt '^'
115 | let endMark = "\{endFence} end \{endFence}"
117 | let lg = logPoint level topic positions
126 | logBounds' : MonadLog m =>
128 | (topic : String) -> So (topic /= "") =>
129 | (positions : LogPositions) ->
132 | logBounds' = logBounds defaultLogLevel
135 | [ElabLog] Elaboration m => MonadLog m where
136 | logPoint level topic positions desc = logMsg topic (toNatLevel level) "\{positions} \{desc}"
139 | [WriterLog] MonadWriter String m => MonadLog m where
140 | logPoint level topic positions desc = tell "\{topic} \{show $ toNatLevel level}: \{positions} \{desc}\n"
142 | export %defaulthint
143 | DefaultLog : Elaboration m => MonadLog m
144 | DefaultLog = ElabLog