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
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: