(* var.sml * * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu) * All rights reserved. *) structure Var = struct datatype var = datatype AST.var datatype var_kind = datatype AST.var_kind fun nameOf (V{name, ...}) = name fun typeOf (V{ty, ...}) = ty fun monoTypeOf (V{ty=([], ty), ...}) = ty | monoTypeOf (V{name, ...}) = raise Fail(name ^ " is not monomrphic") fun kindOf (V{kind, ...}) = kind fun uniqueNameOf (V{name, id, ...}) = name ^ Stamp.toString id fun new (name, kind, ty) = let val id = Stamp.new() in V{name=Atom.toString name, id=id, kind=kind, ty=([], ty)} end fun newPoly (name, kind, scheme) = let val id = Stamp.new() in V{name=Atom.toString name, id=id, kind=kind, ty=scheme} end fun compare (V{id=a, ...}, V{id=b, ...}) = Stamp.compare(a, b) fun same (V{id=a, ...}, V{id=b, ...}) = Stamp.same(a, b) fun hash (V{id, ...}) = Stamp.hash id local structure V = struct type ord_key = var val compare = compare end in structure Map = RedBlackMapFn (V) structure Set = RedBlackSetFn (V) end end