anchor.diff:  open System
   open System.Collections.Generic
   open System.Threading
  +open System.Collections.Concurrent
   
   /// Tuple representing a key used to identify a monitor
   type MonitorKey = (string * Type)
  
positive.code:             }
          loop()
      static let monitorAgent = MailboxProcessor.Start(monitorAgentLoop, cancellationToken)
      
      static let tagAgentLoop (inbox : MailboxProcessor<OkanshiTagMessage>) =
          let rec loop (tags : Tag array) =
              async {
                  let! msg = inbox.Receive()
                  match msg with
                  | SetTags newTags -> return! loop newTags
                  | GetTags reply ->
                      reply.Reply(tags)
                      return! loop tags
              }
          loop [||]
      static let tagAgent = MailboxProcessor.Start(tagAgentLoop, cancellationToken)
  
      /// Gets the default tags added to all monitors created
      static member DefaultTags with get() = tagAgent.PostAndReply(fun reply -> GetTags(reply))
      /// Sets the default tags added to all monitors created
      static member DefaultTags with set(value) = tagAgent.Post(SetTags(value))
      /// Gets the monitor key used to identify monitors
      static member GetMonitorKey(name : string, monitorType : Type) = (name, monitorType)
  
  
negative.code: type OkanshiMonitorMessage =
      private
      | GetMonitor of MonitorKey * MonitorFactory * AsyncReplyChannel<IMonitor>
  
  /// Static use of monitors
  [<AbstractClass; Sealed>]
  