anchor.diff:                      let high = (uint32 parts.[i]) <<< 16
                       let low = (uint32 parts.[i+1])
                       high + low
  -
                   IPv6Address(getUInt32 0, getUInt32 1, getUInt32 2, getUInt32 3)
positive.code:                                 | Choice1Of2 head -> 
                                      (Array.append x [|head|], [||])
                                  | Choice2Of2 tail -> (x, tail)
              | _ -> failwith "can never happen") <|>
          (pstring "::" >>. (h16 .>> pchar ':') |> manyMinMax 5 5|>> Array.ofSeq .>>. ls32)) |>> (fun (t1, t2) ->
              ([||], Array.append t1 t2)) |>> fun (x: uint16 array, y: uint16 array) ->     
                  let zeros =
                      let zerosLength = (8 - x.Length - y.Length)
                      Array.create zerosLength 0us
  
negative.code:         // 6( h16 “:” )           [(h16  “::”) | ls32]
          // “::” 5( h16 “:” ) ls32
  
          let h16 = 
              manyMinMaxSatisfy 1 4 HEXDIG |>> fun x -> Convert.ToUInt16(x, 16)
  
          let ``h16 ":"`` = h16 .>> pchar ':'
  
          let ls32 = 
              let ipv4 = IPv4Address.Parser |>> fun x -> 
                  let v = x.ToUInt32()
                  let x0 = (v &&& 0xFFFF0000ul) >>> 16 |> uint16
                  let x1 = (v &&& 0x0000FFFFul) |> uint16
                  [|x0; x1|]
              let h16h16 = (``h16 ":"`` .>>. h16 |>> fun (x0, x1) ->  [|x0; x1|]) 
              
              ipv4 <|> h16h16
          
          let tail i =
              let remainder =
                  (h16 |>> fun x -> [|x|])  <|>   
                  (manyMinMax 0 i ``h16 ":"`` |>> Array.ofSeq .>>. ls32 |>> fun (x0, x1) -> Array.append x0 x1)
              
              h16 .>> pstring "::" .>>. (remainder <|>% [||])
  
  