package typegist
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha512=6541e4570412fc411f55d1a5cc34817081667f286d425b911795b10637e1e20df41a9e99ba0f7465b00df0588573ae6e7d8c171bbb4521424afc11871a3dedbf
doc/index.html
Typegist v0.0.0
Typegist represents the essence of OCaml types as values.
This dynamic type representation can be used to devise generic type-indexed functions – value serializers, generators, differs, editors, FFI glue, etc. Any accessible type can be described up to the limits defined by its public interface.
Typegist does not model OCaml's type language in full detail. It focuses on a core structural subset decorated with typed-indexed metadata to provide an ergonomic interface for both producers and processors of the representation.
Manuals
The following manuals are available:
- The quick start should do so.
- The Typegist cookbook has a few conventions and gist definition recipes.
- The design notes explains a few design choices made by the library.
Library typegist
TypegistExtendedStdlib.TypeandStdlib.Funmodules. Open to use it.Typegist.Type.GistType gists.Typegist.Fun.GenericGeneric functions.
Quick start
The following shows how to define type gists for a simple data model for todo items. Among other Typegist.Fun.Generic functions this immediately gives us pretty-printing and random generation for testing. Other libraries may give you more, for example the jsont.typegist library derives JSON types from a type gists and thus provides JSON serialization out of the box for the data model.
module Status = struct
type t = Todo | Done | Cancelled
let enum = ["Todo", Todo; "Done", Done; "Cancelled", Cancelled ]
let gist = Type.Gist.variant_of_enum ~name:"Status.t" enum
let pp = Fun.Generic.pp gist
end
module Item = struct
type t = { task : string; status : Status.t; tags : string list }
let make task status tags = { task; status; tags }
let task i = i.task
let status i = i.status
let tags i = i.tags
let gist =
let v1 =
Type.Gist.record "Item.t" make
|> Type.Gist.field "task" Type.Gist.utf_8_string task
|> Type.Gist.field "status" Status.gist status
|> Type.Gist.field "tags" Type.Gist.(list utf_8_string) tags
|> Type.Gist.finish
in
let v1 = Type.Gist.Abstract.Version.make ~name:"v1" v1 in
Type.Gist.abstract "Item.t" [v1]
let pp = Fun.Generic.pp gist
end
let () = Format.printf "%a@." Item.pp (Fun.Generic.random ~size:4 Item.gist ())If you find the randomness to be too arbitrary it is possible to influence the generation process by adding metadata to the description, see this cookbook entry.
The cookbook has more type gist modelling blueprints.