Module Async_invariant.Async
type nonrec 'a t= 'a Async_kernel__.Async_invariant_intf.Async.t
module type S = Async_kernel__.Async_invariant_intf.Async.Smodule type S1 = Async_kernel__.Async_invariant_intf.Async.S1module type S2 = Async_kernel__.Async_invariant_intf.Async.S2module type S3 = Async_kernel__.Async_invariant_intf.Async.S3val invariant : Core_kernel.Source_code_position.t -> 'a -> ('a -> Core_kernel.Sexp.t) -> (unit -> unit Async_kernel.Deferred.t) -> unit Async_kernel.Deferred.tval check_field : 'a -> 'b t -> unit Async_kernel.Deferred.t -> ('a, 'b) Core_kernel.Field.t -> unit Async_kernel.Deferred.tcheck_fieldcan 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)