1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192(** This module defines signatures that extend [Core_kernel.Invariant] with an [Async]
submodule for invariants that use async computation and return [unit Deferred.t]. *)open!Core_kernelopen!ImportmoduleAsync=structtype'at='a->unitDeferred.ttype'ainv='atmoduletypeS=sigtypetvalinvariant:tinvendmoduletypeS1=sigtype'atvalinvariant:'ainv->'atinvendmoduletypeS2=sigtype('a,'b)tvalinvariant:'ainv->'binv->('a,'b)tinvendmoduletypeS3=sigtype('a,'b,'c)tvalinvariant:'ainv->'binv->'cinv->('a,'b,'c)tinvendendmoduletypeAsync_invariant=sigincludemoduletypeofCore_kernel.InvariantmoduleAsync:sigopenAsynctypenonrec'at='aAsync.tmoduletypeS=SmoduletypeS1=S1moduletypeS2=S2moduletypeS3=S3valinvariant:Source_code_position.t->'a->('a->Sexp.t)->(unit->unitDeferred.t)->unitDeferred.t(** [check_field] can be used to check record fields when using [[@@deriving fields]].
Idiomatic usage looks like:
{[
type t = { foo : Foo.t ; bar : Bar.t }
[@@deriving fields]
let invariant t =
Invariant.Async.invariant [%here] t [%sexp_of: t] (fun () ->
let check inv = Invariant.Async.check_field t inv in
Fields.fold ~init:(return ())
~foo: (check Foo.invariant)
~bar: (check Bar.invariant) ]}
When some fields have synchronous invariants, or do not need to be checked, it
may be useful to define a second wrapper around [check_field]:
{[
type t = { foo : Foo.t ; bar : Bar.t ; quux : Quux.t }
[@@deriving fields]
let invariant t =
Invariant.Async.invariant [%here] t [%sexp_of: t] (fun () ->
let check' inv = Invariant.Async.check_field t inv in
let check inv = check' (fun x -> inv x; return ()) in
Fields.fold ~init:(return ())
~foo: (check' Foo.invariant)
~bar: (check Bar.invariant)
~quux: (check ignore) ]} *)valcheck_field:'a->'bt->unitDeferred.t->('a,'b)Field.t->unitDeferred.tendend