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: type OkanshiMonitorMessage =
      private
      | GetMonitor of MonitorKey * MonitorFactory * AsyncReplyChannel<IMonitor>
      
  type OkanshiTagMessage =
      private
      | SetTags of Tag array
      | GetTags of AsyncReplyChannel<Tag array>
  
  /// Static use of monitors
  [<AbstractClass; Sealed>]
  
negative.code:             }
          loop()
      static let monitorAgent = MailboxProcessor.Start(monitorAgentLoop, cancellationToken)
  
      static let tagDictionary = new ConcurrentDictionary<Tag, byte>()
  
      /// Gets the default tags added to all monitors created
      static member DefaultTags with get() = tagDictionary.Keys |> Seq.toArray
      /// Sets the default tags added to all monitors created
      static member DefaultTags
          with set(value : Tag array) =
              tagDictionary.Clear()
              value |> Seq.iter (fun x -> tagDictionary.TryAdd(x, byte 0) |> ignore)
      /// Gets the monitor key used to identify monitors
      static member GetMonitorKey(name : string, monitorType : Type) = (name, monitorType)
  
  