anchor.diff:  /// see the <a href="https://eiriktsarpalis.wordpress.com/2018/10/30/a-contract-pattern-for-schemaless-datastores">A Contract Pattern for Schemaless DataStores</a> blog article for an overview
   type IUnionContract = interface end
   
  -/// Generic encoding abstraction for serializing/deserializing 
  +/// Generic encoding abstraction for serializing/deserializing
   /// to a fixed format type, e.g. string, byte[], Newtonsoft JsonValue etc
   type IEncoder<'Format> =
       /// 'Null' format value to be used for union cases without a payload
  
positive.code: 
                      enc, dec
  
                  | None -> 
                      let enc _ = { CaseName = label ; Payload = encoder.Empty }
                      let dec _ = scase.CreateUninitialized()
                      enc, dec
  
              label, mkCaseEncDec
  
          let labels, encoderFactories = 
              shape.UnionCases 
              |> Array.map genUnionCaseEncoder
              |> Array.unzip
  
  
negative.code:                         let msg = sprintf "Unrecognized case name '%O.%s'" typeof<'Union> e.CaseName
                          raise <| FormatException msg
                      | tag -> caseDecoders.[tag] e.Payload
  
                  member __.TryDecode e =
                      match labelIndex.TryFindIndex e.CaseName with
                      |  -1 -> None
  