Module Base__Invariant
module type S = sig ... end
module type S1 = sig ... end
module type S2 = sig ... end
module type S3 = sig ... end
val invariant : Caml.Lexing.position -> 'a -> ('a -> Base.Sexp.t) -> (unit -> unit) -> unit
invariant here t sexp_of_t f
runsf ()
, and iff
raises, wraps the exception in anError.t
that states "invariant failed" and includes both the exception raised byf
, as well assexp_of_t t
. Idiomatic usage looks like:invariant [%here] t [%sexp_of: t] (fun () -> ... check t's invariants ... )
For polymorphic types:
let invariant check_a t = Invariant.invariant [%here] t [%sexp_of: _ t] (fun () -> ... )
It's okay to use
[%sexp_of: _ t]
because the exceptions raised bycheck_a
will show the parts that are opaque at top-level.
val check_field : 'a -> 'b t -> ('a, 'b) Base.Field.t -> unit
check_field
is used when checking invariants usingFields.iter
. It wraps an exception raised when checking a field with the field's name. Idiomatic usage looks like:type t = { foo : Foo.t; bar : Bar.t; } [@@deriving_inline fields][@@@end] let invariant t : unit = Invariant.invariant [%here] t [%sexp_of: t] (fun () -> let check f = Invariant.check_field t f in Fields.iter ~foo:(check Foo.invariant) ~bar:(check Bar.invariant)) ;;