include Bin_shape_lib.Std.Shapetype tShape.t are constructed by the bin_shape syntax extension from Ocaml type
definitions & expressions.
There is a direct mapping from ocaml type definition syntax to the corresponding
Shape.group and from ocaml type expression syntax to the corresponding Shape.t.
include sig ... endval sexp_of_t : t ‑> Base.Sexp.tTid.t & Vid.t are identifiers for type-constructors & type-vars.
i.e. Given type 'a t = ...
module Tid = Bin_shape_lib.Bin_shape.Tidmodule Vid = Bin_shape_lib.Bin_shape.Vidmodule Location = Bin_shape_lib.Bin_shape.LocationLocation.t is required when constructing shapes for which evaluation might fail.
val group : Location.t ‑> (Tid.t * Vid.t list * t) list ‑> groupThis function is generative; repeated calls create distinct groups
val constr : string ‑> t option ‑> poly_variant_rowval inherit_ : Location.t ‑> t ‑> poly_variant_rowval poly_variant : Location.t ‑> poly_variant_row list ‑> tval var : Location.t ‑> Vid.t ‑> tBuilt-in types and types with custom serialization: i.e. int,list,... To avoid
accidental protocol compatibility, pass a UUID as the string argument
a = annotate s t creates a shape a distinguished, but dependent on shape t.
Very much as record [(s,t)] does.
But with annotate the ocaml record type does not exist.
Shape.Canonical.t is the result of evaluating a shape to a canonical form, and
represents the shape of Ocaml types w.r.t. bin_io serialization.
The idea is that de-serialization is safe if the canonical-shape for the type produced by de-serialization is equivalent to the canonical-shape of the serialized type.
The representation is canonical, so equivalence is structural equality.
Canonical.t also provides a useful human level description of a type.
A Canonical.t can be `digested' to a Digest.t, and except for nearly impossible
hash collisions, equality of the digests implies equality of canonical-shapes and
hence equivalence at the Shape.t level.
Canonical.t may also be constructed with various functions:
annotate, basetype, tuple, record, variant, poly_variant, fix, recurse, ..
which might be used when setting up unit tests or expected shapes.
module Digest = Bin_shape_lib.Bin_shape.Digestmodule Canonical = Bin_shape_lib.Bin_shape.Canonicalval eval : t ‑> Canonical.teval t returns the canonical-shape for a shape-expression Shape.t. Type aliases
are expanded, so that no Tid.t or Vid.t have significance in the resulting
canonical-shape. Type-recursion, including non-regular recursion, is translated to the
de-bruijn representation used in canonical-shapes.
eval_to_digest t returns a hash-value direct from the Shape.t, potentially
avoiding the intermediate Canonical.t from being constructed. This is important as
the size of a canonical-shape might be exponential in terms of the size of the shape
expression. The following holds:
Digest.(eval_to_digest exp = Canonical.to_digest (eval exp))
val eval_to_digest_string : t ‑> stringeval_to_digest_string t == Digest.to_hex (eval_to_digest t)
Convenience function useful for writing unit tests.
module For_typerep = Bin_shape_lib.Bin_shape.For_typerepval bin_shape_unit : tval bin_shape_bool : tval bin_shape_string : tval bin_shape_bytes : tval bin_shape_char : tval bin_shape_float : tval bin_shape_int : tval bin_shape_int32 : tval bin_shape_int63 : tval bin_shape_int64 : tval bin_shape_nativeint : tval bin_shape_nat0 : tval bin_shape_digest : tval bin_shape_float32_vec : tval bin_shape_float64_vec : tval bin_shape_vec : tval bin_shape_float32_mat : tval bin_shape_float64_mat : tval bin_shape_mat : tval bin_shape_bigstring : tval bin_shape_variant_int : tval bin_shape_int_8bit : tval bin_shape_int_16bit : tval bin_shape_int_32bit : tval bin_shape_int_64bit : tval bin_shape_int64_bits : tval bin_shape_network16_int : tval bin_shape_network32_int : tval bin_shape_network32_int32 : tval bin_shape_network64_int : tval bin_shape_network64_int64 : tval bin_shape_float_array : t