# Module Type

    module Type: sig .. end

    type name = string

    type qname = name list

    module NameMap: Map.S  with type key = string

    module NameSet: Set.S  with type elt = string

    type param = name * [ `Minus | `Plus ] option

    type decl = name * param list * rhs * constraint_ list * bool

    type rhs = [ `Expr of expr
           | `Fresh of expr option * repr * [ `Private | `Public ]
           | `Nothing
           | `Variant of variant * [ `Private | `Public ] ]

    type repr =

`|` | `Sum of `summand list``
`|` | `GSum of `name * gsummand list``
`|` | `Record of `field list``

    type field = name * poly_expr * [ `Immutable | `Mutable ]

    type summand = name * expr list

    type gsummand = name * expr list * expr list

    type constraint_ = expr * expr

    type expr = [ `Class of [ `NYI ]
           | `Constr of qname * expr list
           | `Function of expr * expr
           | `GParam of param * expr
           | `Label of [ `NonOptional | `Optional ] * name * expr * expr
           | `Object of [ `NYI ]
           | `Param of param
           | `Tuple of expr list ]

    type poly_expr = param list * expr

    type variant = [ `Eq | `Gt | `Lt ] * tagspec list

    type tagspec =

`|` | `Tag of `name * expr list``
`|` | `Extends of `expr``

    module ParamSet: Set.S  with type elt = param

    module ParamMap: Map.S  with type key = param

    module ExprSet: Set.S  with type elt = expr

    module ExprMap: Map.S  with type key = expr

    module ESet: Set.S  with type elt = name * expr list

    module EMap: Map.S  with type key = name * expr list

    val free_tvars : expr -> ParamSet.t

    val contains_tvars : expr -> bool

    val contains_tvars_decl : decl -> bool

    type subst = expr NameMap.t

    val build_subst : (name * expr) list -> subst

    val substitute_decl : subst -> decl -> decl

    val substitute_expr : subst -> expr -> expr

    val substitute_rhs : subst -> rhs -> rhs

    val substitute_constraint : subst -> constraint_ -> constraint_

    val rename_rhs : name NameMap.t -> rhs -> rhs

    val rename_constraint : name NameMap.t -> constraint_ -> constraint_

    class virtual ['a] fold : object .. end

    class transform : object .. end

    module Translate: sig .. end

    module type Untranslate = sig .. end

    module Untranslate: functor (C : sig
    val _loc : Camlp4.PreCast.Ast.Loc.tend) -> Untranslate

    val print_expr : expr -> string

    val print_rhs : rhs -> string