anchor.diff:  /// Immutable struct holding information relating to a log entry.
   [<Struct>]
   type LogEntry(level : LogLevel, time : DateTime, path : string, message : string) = 
  +
  +    static let separators = [| '\\'; '/' |]
       
       /// The log level of the message
       member __.Level = level
  
positive.code:     /// Logs the message at the fatal level
      member x.F format = Printf.ksprintf (x.Log LogLevel.Fatal) format
      
      override __.ToString() = sprintf "Logger: {path = '%s'; consumers = %A}" path consumer
  
  [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
  module Logger = 
      /// The default logger. Has no path and does nothing on consumption.
      let Default = Logger("", ignore)
      
      /// A logger that prints to std::out / std::err based on the context
      let Printfn = 
          let print (le:LogEntry) = 
              match le.Level with
              | LogLevel.Debug | LogLevel.Info -> printfn "%A" le
              | _ -> eprintfn "%A" le
          
          Logger("", print)
      
      /// Creates a new logger with the provided consumer
      let withConsumer newConsumer (logger : Logger) = Logger(logger.Path, newConsumer)
      
      /// Creates a new logger with the provided path
      let withPath newPath (logger : Logger) = Logger(newPath, logger.Consumer)
      
      /// Creates a new logger with the provided path appended. This is useful for heirarchical logger pathing.
      let appendPath newPath (logger : Logger) = Logger(Path.Combine(logger.Path, newPath), logger.Consumer)
      
      /// Logs a message to the logger at the provided level.
      let inline logf level (logger : Logger) format = logger.Logf level format
  
negative.code: 
  open System
  open System.IO
  open System.Text
  
  type LogLevel = 
      | Debug = 0
  