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 | LogPosition Name where
19 | data LogPositions : Type where
21 | (::) : LogPosition a => a -> LogPositions -> LogPositions
24 | Interpolation LogPositions where
25 | interpolate = joinBy " " . Prelude.toList . toList [<] where
26 | toList : SnocList String -> LogPositions -> SnocList String
28 | toList acc (x::xs) = toList (acc :< logPosition x) xs
31 | length : LogPositions -> Nat
33 | length (_::xs) = S $
length xs
47 | interface ElabLogLevels where
48 | toNatLevel : LogLevel -> Nat
49 | defaultLogLevel : LogLevel
51 | public export %defaulthint
52 | DefaultElabLogLevels : ElabLogLevels
53 | DefaultElabLogLevels = I where
54 | [I] ElabLogLevels where
55 | toNatLevel Warning = 0
57 | toNatLevel Details = 5
58 | toNatLevel FineDetails = 7
59 | toNatLevel Trace = 10
60 | toNatLevel DetailedTrace = 12
61 | toNatLevel Debug = 15
62 | toNatLevel DetailedDebug = 20
63 | defaultLogLevel = Trace
66 | interface Monad m => MonadLog (0 m : Type -> Type) where
67 | constructor MkMonadLog
68 | logPoint : ElabLogLevels =>
69 | (level : LogLevel) ->
70 | (topic : String) -> So (topic /= "") =>
71 | (positions : LogPositions) ->
76 | logPoint' : MonadLog m =>
78 | (topic : String) -> So (topic /= "") =>
79 | (positions : LogPositions) ->
82 | logPoint' = logPoint defaultLogLevel
85 | withLogPoint : MonadLog m =>
87 | (level : LogLevel) ->
88 | (topic : String) -> So (topic /= "") =>
89 | (positions : LogPositions) ->
92 | withLogPoint l t p d x = logPoint l t p d >> x
95 | logValue : MonadLog m =>
97 | (level : LogLevel) ->
98 | (topic : String) -> So (topic /= "") =>
99 | (positions : LogPositions) ->
102 | logValue l t p d x = logPoint l t p d $> x
105 | logBounds : MonadLog m =>
107 | (level : LogLevel) ->
108 | (topic : String) -> So (topic /= "") =>
109 | (positions : LogPositions) ->
112 | logBounds level topic positions action = do
113 | let ticksCnt = (4 `minus` length positions) `max` 1
115 | let startFence = replicate ticksCnt '_'
116 | let startMark = "\{startFence} start \{startFence}"
118 | let endFence = replicate ticksCnt '^'
119 | let endMark = "\{endFence} end \{endFence}"
121 | let lg = logPoint level topic positions
130 | logBounds' : MonadLog m =>
132 | (topic : String) -> So (topic /= "") =>
133 | (positions : LogPositions) ->
136 | logBounds' = logBounds defaultLogLevel
139 | [ElabLog] Elaboration m => MonadLog m where
140 | logPoint level topic positions desc = logMsg topic (toNatLevel level) "\{positions} \{desc}"
143 | [WriterLog] MonadWriter String m => MonadLog m where
144 | logPoint level topic positions desc = tell "\{topic} \{show $ toNatLevel level}: \{positions} \{desc}\n"
146 | export %defaulthint
147 | DefaultLog : Elaboration m => MonadLog m
148 | DefaultLog = ElabLog