module Record:sig
..end
You shall start by declaring a (ghost) type r
and call
Record.signature
to create a signature of type r
, which will be
your container to register your record fields.
Then, populate the signature with Record.field
or Record.option
.
Finally, you shall call Record.publish
to pack the record signature and
obtain a new data module of type Record with type r = r
,
which gives you a Data
with an opaque
type t = r record
with fields of type (r,a) field
.
(* ---- Exemple of Record Data --- *)
type r
let s = Record.signature ~page ~kind ~name ~descr () in
let fd_a = Record.field s ~name:"a" ~descr:"..." (module A) in
let fd_b = Record.field s ~name:"b" ~descr:"..." (module B) in
module M = (val (Record.publish s) : Record with type r = r)
let make a b = M.default |> M.set fd_a a |> M.set fd_b b
type 'a
record
'a
.type 'a
signature
'a
.type ('a, 'b)
field
'b
for a record of type 'a
.module type S =sig
..end
type t = r record
.
val signature : page:Doc.page ->
name:string -> descr:Markdown.text -> unit -> 'a signature
val field : 'r signature ->
name:string ->
descr:Markdown.text ->
?default:'a -> 'a Data.data -> ('r, 'a) field
val option : 'r signature ->
name:string ->
descr:Markdown.text -> 'a Data.data -> ('r, 'a option) field
val publish : 'a signature -> (module Data.Record.S with type r = 'a)