1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
package hm
// An Env is essentially a map of names to schemes
type Env interface {
Substitutable
SchemeOf(string) (*Scheme, bool)
Clone() Env
Add(string, *Scheme) Env
Remove(string) Env
}
type SimpleEnv map[string]*Scheme
func (e SimpleEnv) Apply(sub Subs) Substitutable {
logf("Applying %v to env", sub)
if sub == nil {
return e
}
for _, v := range e {
v.Apply(sub) // apply mutates Scheme, so no need to set
}
return e
}
func (e SimpleEnv) FreeTypeVar() TypeVarSet {
var retVal TypeVarSet
for _, v := range e {
retVal = v.FreeTypeVar().Union(retVal)
}
return retVal
}
func (e SimpleEnv) SchemeOf(name string) (retVal *Scheme, ok bool) { retVal, ok = e[name]; return }
func (e SimpleEnv) Clone() Env {
retVal := make(SimpleEnv)
for k, v := range e {
retVal[k] = v.Clone()
}
return retVal
}
func (e SimpleEnv) Add(name string, s *Scheme) Env {
e[name] = s
return e
}
func (e SimpleEnv) Remove(name string) Env {
delete(e, name)
return e
}
|