anchor.diff:  
   let inline internal startsWith (substr: string) (s: string) = s.StartsWith substr
   
  +/// <summary>
  +/// Parses a single Accept-* header item. 
  +/// Returns item with associated q
  +/// </summary>
  +/// <param name="s">Heaer item split by ';'</param>
   let parseQ s =
       let e = 0.0001
       let s = Array.map lower s
  
positive.code:     | a,b,c,d when a = c && b = d -> Some accepts
      | _ -> None
  
  let filterSortList matcher serves accepts =
      let inline (>>=) a f = Seq.collect f a
      let r = accepts >>= fun a -> serves >>= fun m -> matcher m a |> Seq.singleton
      Seq.choose id r |> Seq.distinct |> Seq.toList
  
negative.code:         | Some i -> Array.append s.[..i-1] s.[i+1..s.Length-1]
      String.Join(";", values), q
  
  /// <summary>
  /// Parses any Accept-* header, returns a seq of items with associated q (quality/preference)
  /// </summary>
  /// <param name="l"></param>
  let parseAccept l =
      split ',' l
      |> Seq.map (split ';')
      |> Seq.map parseQ
  
  /// <summary>
  /// Takes a list of items with associated numeric quality (preference), and:
  /// removes all items with q=0 (i.e. not acceptable by client);
  /// sorts by q descending (client preference)
  /// </summary>
  /// <param name="x"></param>
  let filterSortAccept x =
      x 
      |> Seq.filter (snd >> (<) 0.)
      |> Seq.sortBy (snd >> (*) -1.)
      |> Seq.map fst
      |> Seq.toList
  
  /// <summary>
  /// Parses any Accept-* header. 
  /// Removes all items with q=0 (i.e. not acceptable by client).
  /// Sorts by q descending (client preference)
  /// </summary>
  /// <param name="l"></param>
  let parseFilterSortAccept l =
      parseAccept l |> filterSortAccept
  
  /// <summary>
  /// Splits media type and subtype, e.g. "text/html" -> "text","html"
  