Module Base.Invariant
module type S = sig ... endmodule type S1 = sig ... endmodule type S2 = sig ... endmodule type S3 = sig ... endval invariant : Caml.Lexing.position -> 'a -> ('a -> Sexp.t) -> (unit -> unit) -> unitinvariant here t sexp_of_t frunsf (), and iffraises, wraps the exception in anError.tthat 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_awill show the parts that are opaque at top-level.
val check_field : 'a -> 'b t -> ('a, 'b) Field.t -> unitcheck_fieldis 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)) ;;