anchor.diff:              elif line.Length > 0 then Some line
               else loop (reader.ReadLine())
           loop (reader.ReadLine())
  +
  +
  +    /// reutrns -1 if the entire line is whitespace
  +    let firstNonWhitespaceOffset (line:string) =
  +        [ 0 .. line.Length-1 ] 
  +        |> Seq.tryFind ^ fun idx -> Char.IsWhiteSpace( line.[idx])
  +        |> Option.getOrElse -1
  +
  +
  +    let getLeadingWhitespace (line:string) =
  +        match firstNonWhitespaceOffset line with
  +        | x when x <= -1 -> String.Empty
  +        | offset -> line.Substring( 0,offset)
  +
  +
  +    let getFirstLineText (text:string) =
  +        let lineBreak = text.IndexOf envNewLine
  +        if lineBreak < 0 then text else text.Substring (0,lineBreak+1)
  +
  +
  +    let getLastLineText (text:string) =
  +        let lineBreak = text.LastIndexOf envNewLine
  +        if lineBreak < 0 then text else text.Substring (lineBreak+1)
  +
  +
  +
  +    let convertTabToSpace (tabSize:int) (initialColumn:int) (endPosition:int) (textSnippet:string) : int =
  +        if tabSize <= 0 then invalidArgf "tabsize" "tabsize must be 1 or higher, was '%i' " tabSize
  +        if endPosition < 0 || endPosition  > textSnippet.Length then 
  +            invalidArgf "endPosition" "endPosition must be within the bounds of the textSnippet"
  +        let rec loop col idx =
  +            if idx = endPosition then col - initialColumn 
  +            elif textSnippet.[idx] = '\t' then
  +                loop (col + tabSize - col % tabSize) (idx+1)
  +            else loop col (idx+1)
  +        loop initialColumn 0
  +
  +
  +    let getColumnFromLineOffset (tabSize:int) (endPosition:int) (textSnippet:string) : int =
  +        if tabSize <= 0 then invalidArgf "tabsize" "tabsize must be 1 or higher, was '%i' " tabSize
  +        if endPosition < 0 || endPosition  > textSnippet.Length then 
  +            invalidArgf "endPosition" "endPosition must be within the bounds of the textSnippet"
  +
  +        convertTabToSpace tabSize 0 endPosition   textSnippet 
  +
  +
  +    let getTextColumn (initialColumn:int) (tabsize:int) (text:string) =
  +        let lineText = getLastLineText text
  +        if text <> lineText then 
  +            getColumnFromLineOffset tabsize lineText.Length text
  +        else
  +            (convertTabToSpace tabsize initialColumn text.Length text) + initialColumn
  +
  +
  +    let indexOf (predicate: char -> bool) (text:string) =
  +        if String.IsNullOrEmpty text then -1 else
  +        text.ToCharArray() |> Array.tryFindIndex predicate 
  +        |> Option.getOrElse -1
  +     
  +     
  +    let containsLineBreak (text:string)  = 
  +        text.ToCharArray() 
  +        |> Array.exists (function '\n'|'\r' -> true | _ -> false)
  +
  +
  +  
  +    let getNumberOfLineBreaks (text:string)  = 
  +        let mutable lineBreaks = 0
  +        for i=0 to text.Length-1 do
  +            if text.[i] = '\n' then 
  +                incr &lineBreaks
  +            elif text.[i] == '\r' then
  +                if i+1 = text.Length || text.[i+1] <> '\n' then
  +                    incr &lineBreaks
  +        lineBreaks
  +
  +
  +    let containsTab (text:string)  = 
  +        text.ToCharArray() 
  +        |> Array.exists (function '\t' -> true | _ -> false)
  +
  +
  +    let getLineOffsetFromColumn (tabSize:int) (column:int) (line:string) : int =
  +        let mutable currentColumn = 0
  +        [ 0 .. line.Length-1 ] |> List.tryPick ^ fun x ->
  +            if currentColumn >= column then Some x 
  +            elif line.[i] = '\t' then 
  +                currentColumn <- tabSize - (currentColumn % tabSize); None
  +            else incr &currentColumn; None
  +        |> Option.getOrElse line.Length
  +
   
   
   open System.Text
  
positive.code:     /// Compares two instances of Microsoft.CodeAnalysis.Text.TextSpan
      static member CompareTo (a:TextSpan,b:TextSpan) = a.CompareTo b
  
  type SourceText with
      
      member self.Text with get () = self.ToString()
  
negative.code: [<RequireQualifiedAccess>]
  [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
  module String =
  
      let inline toCharArray (str:string) = str.ToCharArray()
  
      let lowerCaseFirstChar (str: string) =
  