anchor.diff:  open FSharpLex.SpecializedCollections
   
   
  -/// DFA state.
  -[<Measure>] type DfaState
  -/// Unique identifier for a state within a DFA.
  -type DfaStateId = int<DfaState>
  -
   /// <summary>The source and target state of a transition
   /// edge in an NFA transition graph.</summary>
   /// <remarks>Used as a key for sparse graph implementations
   /// because it's more efficient than an F# tuple.</remarks>
   [<Struct>]
   [<DebuggerDisplay("{Source} -> {Target}")>]
  -type TransitionEdgeKey =
  +type TransitionEdgeKey<[<Measure>] 'Tag> =
       /// The source vertex of the edge.
  -    val Source : DfaStateId
  +    val Source : int<'Tag>
       /// The target vertex of the edge.
  -    val Target : DfaStateId
  +    val Target : int<'Tag>
   
       new (source, target) =
           {   Source = source;
  
positive.code: 
          let eofEdgeKey = TransitionEdgeKey (source, target)
  
          LexerDfaGraph (
              vertexCount,
              adjacencyMap,
              Some eofEdgeKey)
          
  /// Functions on LexerDfaGraph.
  [<RequireQualifiedAccess; CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
  module LexerDfaGraph =
      /// The empty graph.
      let empty = LexerDfaGraph.Empty
  
      /// Determines if the graph is empty -- i.e., if it's vertex set is empty.
      let inline isEmpty (graph : LexerDfaGraph) =
  
negative.code:     "Vertices = {VertexCount}, \
       EdgeSets = {EdgeSetCount}, \
       Edges = {EdgeCount}")>]
  type SparseMultiDigraph<[<Measure>] 'Tag>
      private (vertexCount : int, adjacencyMap : Map<TransitionEdgeKey<'Tag>, CharSet>, eofTransition : TransitionEdgeKey<'Tag> option) =
      //
      static let empty =
          SparseMultiDigraph (GenericZero, Map.empty, None)
  
      //
      static member internal Empty
  