package edit
import (
)
var errValueShouldBeFn = errors.New("value should be function")
type bindingsMap struct {
hashmap.Map
}
var emptyBindingsMap = bindingsMap{vals.EmptyMap}
func ( bindingsMap) ( int) string {
var ui.Keys
for := .Map.Iterator(); .HasElem(); .Next() {
, := .Elem()
= append(, .(ui.Key))
}
sort.Sort()
:= vals.NewMapReprBuilder()
for , := range {
, := .Map.Index()
.WritePair(parse.Quote(.String()), +2, vals.Repr(, +2))
}
return .String()
}
func ( bindingsMap) ( interface{}) (interface{}, error) {
, := toKey()
if != nil {
return nil,
}
return vals.Index(.Map, )
}
func ( bindingsMap) ( interface{}) bool {
, := .Map.Index()
return
}
func ( bindingsMap) ( ui.Key) eval.Callable {
, := .Map.Index()
if ! {
panic("get called when key not present")
}
return .(eval.Callable)
}
func ( bindingsMap) (, interface{}) (interface{}, error) {
, := toKey()
if != nil {
return nil,
}
, := .(eval.Callable)
if ! {
return nil, errValueShouldBeFn
}
:= .Map.Assoc(, )
return bindingsMap{}, nil
}
func ( bindingsMap) ( interface{}) interface{} {
, := toKey()
if != nil {
return
}
return bindingsMap{.Map.Dissoc()}
}
func ( hashmap.Map) (bindingsMap, error) {
:= vals.EmptyMap
for := .Iterator(); .HasElem(); .Next() {
, := .Elem()
, := .(eval.Callable)
if ! {
return emptyBindingsMap, errValueShouldBeFn
}
, := toKey()
if != nil {
return bindingsMap{},
}
= .Assoc(, )
}
return bindingsMap{}, nil
}