diff --git a/py/set.go b/py/set.go index af4eb4e5..a27143ba 100644 --- a/py/set.go +++ b/py/set.go @@ -142,6 +142,43 @@ func (s *Set) M__or__(other Object) (Object, error) { return ret, nil } +func (s *Set) M__sub__(other Object) (Object, error) { + ret := NewSet() + b, ok := other.(*Set) + if !ok { + return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name) + } + for j := range s.items { + ret.items[j] = SetValue{} + } + for i := range b.items { + if _, ok := s.items[i]; ok { + delete(ret.items, i) + } + } + return ret, nil +} + +func (s *Set) M__xor__(other Object) (Object, error) { + ret := NewSet() + b, ok := other.(*Set) + if !ok { + return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name) + } + for j := range s.items { + ret.items[j] = SetValue{} + } + for i := range b.items { + _, ok := s.items[i] + if ok { + delete(ret.items, i) + } else { + ret.items[i] = SetValue{} + } + } + return ret, nil +} + // Check interface is satisfied var _ I__len__ = (*Set)(nil) var _ I__bool__ = (*Set)(nil) diff --git a/py/tests/set.py b/py/tests/set.py index e46b412a..f6fa539a 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -30,4 +30,32 @@ assert 4 in c assert 5 in c +doc="__sub__" +a = {1, 2, 3} +b = {2, 3, 4, 5} +c = a.__sub__(b) +d = b.__sub__(a) +assert 1 in c +assert 4 in d +assert 5 in d + +e = a - b +f = b - a +assert 1 in c +assert 4 in d +assert 5 in d + +doc="__xor__" +a = {1, 2, 3} +b = {2, 3, 4, 5} +c = a.__xor__(b) +assert 1 in c +assert 4 in c +assert 5 in c + +d = a ^ b +assert 1 in c +assert 4 in c +assert 5 in c + doc="finished" \ No newline at end of file