úÎk•hµ      SafeAT[ BStrings separated by a forward slash. Doesn't contain white space.Use ! (GHC's OverloadedStrings extension) to construct a  .DebugInfoWarningError path msg' allows you to to log messages of type msg, under a scope identified by path (think of path as a filesystem path).Each msg gets logged together with its , path and the "6 timestamp stating 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ÿi values that convey their scope. Instead, it delays conversion from these precise types into the ultimately desired raw representation 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 0 that gets enriched with more information as we  down the pathC). This improves type safety, as well as the composability of the path and msg values. In particular, path and msg$ are contravariant values (see the  and   functions).DContrary to other logging approaches based on monadic interfaces, a @ is a value that is expected to be passed around explicitly. A › can be safely used concurrently, and messages are rendered in the order they were submitted for logging, both in the case of synchronous logging (e.g., #) and asynchronous logging (e.g., ).  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.$Used to implement the  function while preserving the % semantics of the path' type.&)Minimum level that we are allowed to log.'+Work queue. This queue keeps fully applied # calls.Build a  from a logging function.(?Block until all messages being logged have finished processing.),Asynchronously log a message with the given ¥ by queueing it in FIFO order to be logged in a different thread as soon as possible. The timestamp of the logged message will correctly represent the time of the ) call.WARNING´ This function returns immediately, which makes it ideal for usage in tight loops. However, if logging the message fails later, you won't be able to catch the relevant exception.*Log a message with the given . Push a new path to the .The passed in * can continue to be used even after using  or the returned .See  for an example behaviour.A  is contravariant in its path argument.#This function is used to go from a  more general to a  more specific type of path. For example, [+] is a more specific 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 ,X, such as dictionary words. We can convert from the more general to the more specific path type using this  function:  (x ::  [,] msg) (- .) ::  [+] msg The %al behavior of the original path' is preserved in the resulting . A  is contravariant in its msg argument.#This function is used to go from a  more general to a  more specific type of msg. For example, + is a more specific type than ,|, since the former clearly conveys the idea of a numbers, whereas the latter could be a anything that is representable as ,X, such as a dictionary word. We can convert from the more general to the more specific msg type using this   function:   (x ::  path ,) . ::  path + Returns a new # on which messages below the given = are not logged, where ther ordering of levels is as follow:  <  <  <   For example,   x  will prevent  and  from being logged. Notice that   di x< will allow messages with a level greater than or equal to x8 even if they had been previously silenced in the given di. !Synchronously log a message with  level. !Synchronously log a message with  level. !Synchronously log a message with  level.!Synchronously log a message with  level."Asynchronously log a message with « level by queueing it in FIFO order to be logged in a different thread as soon as possible. The timestamp of the logged message will correctly represent the time of the  call.WARNING´ This function returns immediately, which makes it ideal for usage in tight loops. However, if logging the message fails later, you won't be able to catch the relevant exception."Asynchronously log a message with « level by queueing it in FIFO order to be logged in a different thread as soon as possible. The timestamp of the logged message will correctly represent the time of the  call.WARNING´ This function returns immediately, which makes it ideal for usage in tight loops. However, if logging the message fails later, you won't be able to catch the relevant exception."Asynchronously log a message with « level by queueing it in FIFO order to be logged in a different thread as soon as possible. The timestamp of the logged message will correctly represent the time of the  call.WARNING´ This function returns immediately, which makes it ideal for usage in tight loops. However, if logging the message fails later, you won't be able to catch the relevant exception."Asynchronously log a message with « level by queueing it in FIFO order to be logged in a different thread as soon as possible. The timestamp of the logged message will correctly represent the time of the  call.WARNING´ This function returns immediately, which makes it ideal for usage in tight loops. However, if logging the message fails later, you won't be able to catch the relevant exception./ is written to 0* using the system's locale encoding. See  for example output./ is written to 1$ using the system's locale encoding. > d0 <-  >   d0 "a" (DBG 2017-05-06T19:01:27:306168750000Z: a$ > let d1 = push d0 "f/oo" -- '/' is converted to '.' >   d1 "b" -INF 2017-05-06T19:01:27:314333636000Z f.oo: b% > let d2 = push d1 "b ar" -- ' ' is converted to '_' >   d2 "c" 2WRN 2017-05-06T19:01:27:322092498000Z f.oo/b_ar: c > let d3 = push d2 "qux" >  d3 "d" 6ERR 2017-05-06T19:01:27:326704385000Z f.oo/b_ar/qux: d >  d0 "e\nf" -- d0, of course, still works +ERR 2017-05-06T19:01:27:823167007000Z: e\nf % 234#$&'()* 567    234#$&'()* 5678      !"#$%&'()*+$,-./012345$,6$,7$89:;<$=>$?@#ABCDEdi-0.1-Hrk8aUbd37a5HZIdpjGdgMDiData.Map.StrictMapLevelDBGINFWRNERRmkDipushpathmsgleveldbginfwrnerrdbg'inf'wrn'err'mkDiTextFileHandlemkDiTextStderr$fMonoidTextPath$fIsStringTextPath $fEqLevel $fOrdLevel $fEnumLevel$fBoundedLevel $fShowLevel $fReadLevel $fEqTextPath $fOrdTextPath$fShowTextPathTextPathbase Data.String fromString time-1.6.0.1Data.Time.Clock.UTCUTCTime_diLog _diPathMapGHC.BaseMonoid _diMinLevel_diLogsdiFlushdiAsyncdiSyncghc-prim GHC.TypesIntStringmapGHC.Showshow#text-1.2.2.1-9Yh8rJoh8fO2JMLWffT3QsData.Text.InternalTextGHC.IO.Handle.TypesHandleGHC.IO.Handle.FDstderr unTextPathtextPathSingleton renderIso8601 catchSync