sig
type t =
Unit
| Bool
| Float
| Char
| String
| Int of int option
| Enum of Type.t
| Tuple of Type.t list
| Dict of (string * [ `RO | `RW ] * Type.t) list
| Sum of (string * Type.t list) list
| Option of Type.t
| Rec of string * Type.t
| Var of string
| Arrow of Type.t * Type.t
| Ext of string * Type.t
val is_mutable : Type.t -> bool
val free_vars : Type.t -> string list
val foreigns : Type.t -> string list
val unroll : (string * Type.t) list -> Type.t -> Type.t
val is_subtype_of : Type.t -> Type.t -> bool
val ( <: ) : Type.t -> Type.t -> bool
val string_of_last_type_error : unit -> string
val to_string : Type.t -> string
exception Parse_error of string
val of_string : string -> Type.t
end