anchor.diff:  open System.Collections.Generic
   open FSharpx.Strings
   
  +[<RequireQualifiedAccess>]
   type Token =
   | OpenBracket | CloseBracket
   | OpenArray | CloseArray
  
positive.code: 
      let rec tokenize' acc = function
          | w :: t when Char.IsWhiteSpace(w) -> tokenize' acc t   // skip whitespace
          | '{' :: t -> tokenize' (OpenBracket :: acc) t
          | '}' :: t -> tokenize' (CloseBracket :: acc) t
          | '[' :: t -> tokenize' (OpenArray :: acc) t
          | ']' :: t -> tokenize' (CloseArray :: acc) t
          | ':' :: t -> tokenize' (Colon :: acc) t
          | ',' :: t -> tokenize' (Comma :: acc) t
          | 'n' :: 'u' :: 'l' :: 'l' :: t -> tokenize' (Token.Null :: acc) t
          | 't' :: 'r' :: 'u' :: 'e' :: t -> tokenize' (Boolean true :: acc) t
          | 'f' :: 'a' :: 'l' :: 's' :: 'e' :: t -> tokenize' (Boolean false :: acc) t
          | '"' :: t -> // start of string
              let s, t' = parseString "" t
              tokenize' (Token.String(s) :: acc) t'        
  
negative.code:     | v -> failwith "Syntax Error, unrecognized token in map()"
   
      let rec parseValue = function
      | Token.OpenBracket :: t -> parseJObject t
      | Token.OpenArray :: t ->  parseArray t
      | h :: t -> map h, t
      | _ -> failwith "bad value"
   
      and parseArray = function
      | Token.Comma :: t -> parseArray t
      | Token.CloseArray :: t -> JArray.New() :> IDocument, t
      | t ->        
          let element, t' = parseValue t
          match parseArray t' with
  