anchor.diff:  //open System.Diagnostics.Contracts
   
   
  -/// A substring.
  -[<Struct>]
  -type Substring =
  -    //
  +/// Represents a segment of a string.
  +[<Struct; CompiledName("Substring")>]
  +type substring =
  +    /// The underlying string for this substring.
       val String : string
       //
       val Offset : int
       //
       val Length : int
       
  -    /// <summary>Create a new Substring value.</summary>
  +    /// <summary>Create a new substring value.</summary>
       /// <param name="string"></param>
       /// <param name="offset"></param>
       /// <param name="length"></param>
  
positive.code:                             if Char.IsWhiteSpace str.[i] then
                                  // Apply the function to the current substring unless it's empty.
                                  if length > 0 then
                                      action.Invoke (substringIndex, Substring (str, offset, length))
  
                                  // Update the offset to just past the end of this substring
                                  // and reset the length to zero to begin a new substring.
  
negative.code:                             if Array.BinarySearch (sortedSeparators, str.[i]) >= 0 then
                                  // Apply the function to the current substring unless it's empty.
                                  if length > 0 then
                                      state <- folder.Invoke (state, substringIndex, substring (str, offset, length))
  
                                  // Update the offset to just past the end of this substring
                                  // and reset the length to zero to begin a new substring.
  