123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687(** This module defines signatures that extend [Core.Invariant] with an [Async]
submodule for invariants that use async computation and return [unit Deferred.t]. *)open!Coreopen!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.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