sig
  type ('a, 'b) t
  val empty : ('a, 'b) Extfun.t
  val apply : ('a, 'b) Extfun.t -> '-> 'b
  exception Failure
  val print : ('a, 'b) Extfun.t -> unit
  type ('a, 'b) matching = {
    patt : Extfun.patt;
    has_when : bool;
    expr : ('a, 'b) Extfun.expr;
  }
  and patt =
      Eapp of Extfun.patt list
    | Eacc of Extfun.patt list
    | Econ of string
    | Estr of string
    | Eint of string
    | Etup of Extfun.patt list
    | Evar of unit
  and ('a, 'b) expr = '-> 'b option
  val extend :
    ('a, 'b) Extfun.t ->
    (Extfun.patt * bool * ('a, 'b) Extfun.expr) list -> ('a, 'b) Extfun.t
end