anchor.diff:  open System.Globalization
   
   type LogLevel =
  +    /// Lowest level.
       | Trace = 0
  +    /// Higher than the trace level and lower than the info level.
       | Debug = 1
  +    /// Higher than the debug level and lower than the notice level.
       | Info = 2
  +    /// Higher than the info level and lower than the warn level.
       | Notice = 3
  +    /// Higher than the notice level and lower than the error level.
       | Warn = 4
  +    /// Higher than the warn level and lower than the fatal level.
       | Error = 5
  +    /// Highest level.
       | Fatal = 6
   
   /// Immutable struct holding information relating to a log entry.
   [<Struct>]
  -type LogEntry(level : LogLevel, time : DateTime, path : string, message : string) = 
  +type LogEntry(level : LogLevel, time : DateTime, path : string, message : string) =
   
       static let separators = [| '\\'; '/' |]
  -    
  +
       /// The log level of the message
  -    member __.Level = level
  -    
  +    member _.Level = level
  +
       /// The time at which the entry was logged
  -    member __.Time = time
  -    
  +    member _.Time = time
  +
       /// The source of the message
  -    member __.Path = path
  -    
  +    member _.Path = path
  +
       /// The actual log message
  -    member __.Message = message
  -    
  -    override __.ToString() = sprintf "[%A|%A]%s:%s" time level path message
  +    member _.Message = message
  +
  +    override _.ToString() = $"[{time}|{level}]{path}:{message}"
   
       /// Retrieves a string representation of the long message using some default formatting. This is a more compact representation than ToString()
  -    member __.ShortString = 
  +    member _.ShortString =
           let sb = StringBuilder(path.Length)
           let idx = path.LastIndexOfAny(separators, path.Length - 1)
           let ts = DateTimeFormatInfo.CurrentInfo.LongTimePattern
  
positive.code:             | _ -> System.Console.Error.WriteLine(le.ShortString)
              System.Console.ResetColor()
          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
      /// This accepts a format string.
      let withPath format =
          Printf.ksprintf (fun path (logger:Logger) -> Logger(path.Replace('\\', '/'), logger.Consumer)) format
      
      /// Creates a new logger with the provided path appended. This is useful for heirarchical logger pathing.
      /// This accepts a format string.
      let appendPath format =
          Printf.ksprintf (fun path (logger : Logger) -> Logger(Path.Combine(logger.Path, path).Replace('\\', '/'), logger.Consumer)) format
      
      /// Logs a message to the logger at the provided level.
      /// This accepts a format string.
      let logf level format =
          Printf.ksprintf (fun msg (logger:Logger) -> logger.Log level msg) format
           
      
      /// Adds a consumer to the logger, such that the new and current consumers are run.
      let addConsumer newConsumer (logger : Logger) = 
          let curConsumer = logger.Consumer
          
          let consume l = 
              curConsumer l
              newConsumer l
          logger |> withConsumer consume
          
      /// Removes all consumers from the logger.
      let removeConsumer (logger : Logger) = logger |> withConsumer Unchecked.defaultof<_>
      
      /// Creates a new logger with a mapping function over the log entries.
      let decorate f (logger : Logger) = Logger(logger.Path, f >> logger.Consumer)
      
      /// Creates a new logger that indents all messages in the logger by 4 spaces.
      let indent : Logger -> Logger = 
          let indentF (l : LogEntry) = LogEntry(l.Level, l.Time, l.Path, sprintf "    %s" l.Message)
          decorate indentF
  
negative.code: //The MIT License (MIT)
  //
  //Copyright (c) 2021
  //
  //Permission is hereby granted, free of charge, to any person obtaining a copy
  //of this software and associated documentation files (the "Software"), to deal
  