anchor.diff:                  c.GetFields()
                   |> Array.map (fun f -> dE f.PropertyType)
               (r, fs))
  -    fun (i: M.Info) (x: obj) ->
  +    fun (i: FormatSettings) (x: obj) ->
           match x with
           | null ->
               EncodedObject [("$", EncodedNumber "0")]
  -            |> addTag i t
  +            |> i.AddTag t
           | o when t.IsAssignableFrom(o.GetType()) ->
               let tag = tR o
               let (r, fs) = cs.[tag]
  
positive.code:         | true, x -> Some x
          | _ -> None
  
  let addTag (i: M.Info) (t: System.Type) (v: Encoded) =
      let mt = R.TypeDefinition.FromType t
      match i.GetAddress mt with
      | None -> v
      | Some a ->
          match v with
          | EncodedObject fs -> EncodedInstance (a, fs)
          | _ -> v
  
  let unionEncoder dE (t: System.Type) =
      let tR = FSV.PreComputeUnionTagReader(t, flags)
      let cs =
  
negative.code:             let r = FSV.PreComputeRecordFieldReader f
              (f.Name, r, dE f.PropertyType))
      let mt = R.TypeDefinition.FromType t
      fun (i: FormatSettings) (x: obj) ->
          match x with
          | null ->
              raise EncoderException
          | o when o.GetType() = t ->
              fs
              |> Array.map (fun (n, r, enc) ->
                  (i.GetEncodedRecordFieldName mt n, enc i (r o)))
              |> Array.toList
              |> EncodedObject
              |> i.AddTag t
          | _ ->
              raise EncoderException
  
  