# Functor Debug.Make

    module Make: functor (* : sigend) -> sig .. end

`Debug.Make` produces a `debug` function used to wrap a function to display arguments before calling and display results after returning. Intended usage is:

          module Foo = struct
            type t = ...
              let invariant = ...
                let bar t x y : Result.t = ...
          end
          module Foo_debug = struct
            open Foo
            include Debug.Make ()
            let debug x = debug invariant ~module_name:"Foo" x
            let bar t x y =
              debug "bar" [t] (t, x, y) <:sexp_of< t * X.t * Y.t >> <:sexp_of< Result.t >>
                (fun () -> bar t x y)
          end

Parameters:

`*` | : | `()`

    val check_invariant : bool Pervasives.ref

Whether the invariants are called on each invocation

    val show_messages : bool Pervasives.ref

If true, you get a message on stderr every time `debug` is called

    val debug : 't Invariant.t ->
           module_name:string ->
           string ->
           't list ->
           'args ->
           ('args -> Sexplib.Sexp.t) ->
           ('result -> Sexplib.Sexp.t) -> (unit -> 'result) -> 'result

We avoid labels so that the applications are more concise -- see example above