package base

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type
type nonrec 'a t = 'a -> unit
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 -> Sexp.t) -> (unit -> unit) -> unit

invariant here t sexp_of_t f runs f (), and if f raises, wraps the exception in an Error.t that states "invariant failed" and includes both the exception raised by f, as well as sexp_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 by check_a will show the parts that are sexp_opaque at top-level.

val check_field : 'a -> 'b t -> ('a, 'b) Field.t -> unit

check_field is used when checking invariants using Fields.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)) ;;

OCaml

Innovation. Community. Security.