úÎY•W¬   SafeT  level path msg' allows you to to log messages of type msg , with a particular importance level, under a scope identified by path (think of pathP as a filesystem path that you can use to group together related log messages).Each msg gets logged together with its level, path and the  8 stating the instant when the logging requests was made.?Even though logging is usually associated with rendering text, - makes no assumption about the types of the msg values being logged, nor the path* values that convey their scope, nor the levelÿv values that convey their importance. Instead, it delays conversion from these precise types into the ultimately desired raw representation (if any) as much as possible. This makes it possible to log more precise information (for example, logging a datatype of your own without having to convert it to text first), richer scope paths (for example, the scope could be a 1 that gets enriched with more information as we  down the path), and importance levelks that are never too broad nor too narrow. This improves type safety, as well as the composability of the level, path and msg values. In particular, all of level, path and msgH are contravariant values, which in practice means including a precise  into a more general , is always possible (see the 'contralevel@,  and  functions).>Messages of undesired importance levels can be muted by using .DContrary to other logging approaches based on monad transformers, a l is a value that is expected to be passed around explicitly. Of course, if necessary you can always put a l in some internal monad state or environment and provide a custom API for it. That's a choice you can make.A s can be safely used concurrently, and messages are rendered in the absolute order they were submitted for logging.  is pronounced as "dee" (not "die" nor "dye" nor "day"). "Di" is the spanish word for an imperative form of the verb "decir", which in english means "to say". Low level logging function. Whether a particular message level should be logged or not.+Work queue. This queue keeps fully applied   calls. Build a new  from a logging function.Note: If the passed in 9 function throws a exception, it will be just logged to  and then ignored.Note:+ There's no need to "release" the obtained .(Log a message with the given importance level.§This function returns immediately after queing the message for logging in a different thread. If you want to explicitly wait for the message to be logged, then call  afterwards.Note:> No exceptions from the underlying logging backend (i.e., the  action given to ) will be thrown from &. Instead, those will be recorded to  and ignored.?Block until all messages being logged have finished processing.Mabually calling ¡ is not usually necessary, but, if at some point you want to ensure that all messages logged until then have properly rendered to the underlying backend, then  will block until that happens.Returns a new  on which only messages with a level= satisfying the given predicate in addition to any previous s are ever logged. Identity:  (  ) ==   Composition:  ( (&&) f g) ==  f .  g Conmutativity:  f .  g ==  g .  f  Push a new path to the . Identity:   ==   Composition:  (a <> b) ==  b .  a A  is contravariant in its level argument.#This function is used to go from a  more general to a  less general type of level. For example, data Level = Info | Error is a less general type than 'data Level' = Info' | Warning' | Error'—, since the former can only convey two logging levels, whereas the latter can convey three. We can convert from the more general to the less general level type using this  function: 3 (\case { Info -> Info'; Error -> Error' }) (di ::  Level' [] msg) ::  Level [] msg  Identity:   ==   Composition:  (f . g) ==  g .  f A  is contravariant in its path argument.#This function is used to go from a  more general to a  less specific type of path. For example, [] is a less general type than []Œ, since the former clearly conveys the idea of a list of numbers, whereas the latter could be a list of anything that is representable as `, such as names of fruits and poems. We can convert from the more general to the less general path type using this  function:  (  ) (di ::  level [] msg) ::  [] msg  Identity:   ==   Composition:  (f . g) ==  g .  f A  is contravariant in its msg argument.#This function is used to go from a  more general to a  less general type of msg. For example,  is a less general type than |, since the former clearly conveys the idea of a numbers, whereas the latter could be a anything that is representable as b, such as names of painters and colors. We can convert from the more general to the less general msg type using this  function:   (di ::  level path  ) ::  level path   Identity:   ==   Composition:  (f . g) ==  g .  f      Safe[BStrings separated by a forward slash. Doesn't contain white space.Use  (GHC's OverloadedStrings extension) to construct a . s are written to  using the  s locale encoding.  is written to $ using the system's locale encoding.  ! "#$  ! "#$Safe   %     !"#$%&'()*+,-./+01)234di-0.2-GHu1UZN6HRkCcF69zJpt5vDiDi.CoreData.Map.StrictMapControl.ApplicativeliftA2 Di.BackendIOHandle'mkDilogflushfilterpush contralevel contrapath contramsgmkDiStringHandlemkDiStringStderr time-1.6.0.1Data.Time.Clock.UTCUTCTime_diLog _diFilter_diLogsghc-prim GHC.TypesbaseGHC.IO.Handle.FDstderrGHC.BaseconstTrueidmemptyStringIntmapGHC.Showshow renderIso8601 catchSync StringPath Data.String fromStringGHC.IO.Handle.TypesHandle unStringPathstringPathSingleton$fMonoidStringPath$fIsStringStringPath