module type DATA_SIG = sig type 'a typ type 'a returnType val compare_typ: 'a typ -> 'b typ -> ('a, 'b) Tools.cmp val repr: Format.formatter -> 'a typ -> unit end module Make(D:DATA_SIG): sig type t type 'a t_function = | Fn1: 'b D.returnType * ('a -> 'b) -> 'a t_function | Fn2: 'c D.returnType * ('a -> 'b -> 'c) -> ('a * 'b) t_function | Fn3: 'd D.returnType * ('a -> 'b -> 'c -> 'd) -> ('a * 'b * 'c) t_function type 'a sig_typ = | T1: 'a D.typ -> 'a t_function sig_typ | T2: 'a D.typ * 'b D.typ -> ('a * 'b) t_function sig_typ | T3: 'a D.typ * 'b D.typ * 'c D.typ -> ('a * 'b * 'c) t_function sig_typ (** Empty catalog *) val empty: t (** Register a new function in the catalog *) val register : t -> string -> 'a t_function sig_typ -> 'a t_function -> t (** Find a function with the given name and signature *) val find_function: t -> string -> 'a t_function sig_typ -> 'a t_function val repr: Format.formatter -> t -> unit end