anchor.diff:    | Underline of FountainSpans
     | HardLineBreak
   
  -/// A type alias for a list of `MarkdownSpan` values
  +/// A type alias for a list of `FountainSpan` values
   and FountainSpans = list<FountainSpan>
   
   /// A paragraph represents a (possibly) multi-line element of a fountain document.
  
positive.code:     | HardLineBreak ->
          SpanLeaf(SL span) //SpanLeafInfo or (SpanNodeInfo * FountainSpans)
      | Strong spans 
      | Emphasis spans -> 
          SpanNode(SN span, spans)
      | Underline spans ->
          SpanNode(SN span, spans)
  
    let SpanLeaf (SL(span)) = span
    let SpanNode (SN(span), spans) =
      match span with
      | Strong _ -> Strong spans 
      | Emphasis _ -> Emphasis spans
      | _ -> invalidArg "" "Incorrect SpanNodeInfo"
  
    type ParagraphSpansInfo = private PS of FountainParagraph
    type ParagraphLeafInfo = private PL of FountainParagraph
    type ParagraphNestedInfo = private PN of FountainParagraph
  
  // TODO: really wish i understood what was happenign here.
  //  let (|ParagraphLeaf|ParagraphNested|ParagraphSpans|) par =
    let (|ParagraphSpans|) par =
      match par with  
      | Section(_, spans)
  
negative.code: type FountainParagraph = 
    | Section of int * FountainSpans
    | Paragraph of FountainSpans
    | Span of FountainSpans
  
  // Document as a tree
  /// This module provides an easy way of processing Markdown documents.
  /// It lets you decompose documents into leafs and nodes with nested paragraphs.
  module Matching =
  
    // TODO: Question: both SL and SN have the same definition here, are tehy just marker types or something?
  
    // represents a Leaf in the tree; that is a node that doesn't have any children
    type SpanLeafInfo = 
  