Refactor VM and operators
This commit is contained in:
@@ -75,6 +75,46 @@ func (h *Hash) String() string {
|
||||
return h.Inspect()
|
||||
}
|
||||
|
||||
func (h *Hash) Add(other Object) (Object, error) {
|
||||
if other.Type() != h.Type() {
|
||||
return nil, NewBinaryOpError(h, other, "+")
|
||||
}
|
||||
|
||||
pairs := make(map[HashKey]HashPair)
|
||||
for k, v := range h.Pairs {
|
||||
pairs[k] = v
|
||||
}
|
||||
for k, v := range other.(*Hash).Pairs {
|
||||
pairs[k] = v
|
||||
}
|
||||
return &Hash{Pairs: pairs}, nil
|
||||
}
|
||||
|
||||
func (h *Hash) Get(index Object) (Object, error) {
|
||||
key, ok := index.(Hashable)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid hash key %s", index.Type())
|
||||
}
|
||||
|
||||
pair, found := h.Pairs[key.HashKey()]
|
||||
if !found {
|
||||
return &Null{}, nil
|
||||
}
|
||||
|
||||
return pair.Value, nil
|
||||
}
|
||||
|
||||
func (h *Hash) Set(index, other Object) error {
|
||||
key, ok := index.(Hashable)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid hash key %s", index.Type())
|
||||
}
|
||||
|
||||
h.Pairs[key.HashKey()] = HashPair{Key: index, Value: other}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *Hash) Compare(other Object) int {
|
||||
if obj, ok := other.(*Hash); ok {
|
||||
if len(h.Pairs) != len(obj.Pairs) {
|
||||
|
||||
Reference in New Issue
Block a user