Skip to content

Commit 70a66f2

Browse files
DoDaekcorona10
authored andcommitted
set: Implement __sub__ and __xor__ of set (#88)
* set: Implement __sub__ of set * set: Implement __xor__ of set
1 parent 37cc47f commit 70a66f2

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

py/set.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,43 @@ func (s *Set) M__or__(other Object) (Object, error) {
142142
return ret, nil
143143
}
144144

145+
func (s *Set) M__sub__(other Object) (Object, error) {
146+
ret := NewSet()
147+
b, ok := other.(*Set)
148+
if !ok {
149+
return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name)
150+
}
151+
for j := range s.items {
152+
ret.items[j] = SetValue{}
153+
}
154+
for i := range b.items {
155+
if _, ok := s.items[i]; ok {
156+
delete(ret.items, i)
157+
}
158+
}
159+
return ret, nil
160+
}
161+
162+
func (s *Set) M__xor__(other Object) (Object, error) {
163+
ret := NewSet()
164+
b, ok := other.(*Set)
165+
if !ok {
166+
return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name)
167+
}
168+
for j := range s.items {
169+
ret.items[j] = SetValue{}
170+
}
171+
for i := range b.items {
172+
_, ok := s.items[i]
173+
if ok {
174+
delete(ret.items, i)
175+
} else {
176+
ret.items[i] = SetValue{}
177+
}
178+
}
179+
return ret, nil
180+
}
181+
145182
// Check interface is satisfied
146183
var _ I__len__ = (*Set)(nil)
147184
var _ I__bool__ = (*Set)(nil)

py/tests/set.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,32 @@
3030
assert 4 in c
3131
assert 5 in c
3232

33+
doc="__sub__"
34+
a = {1, 2, 3}
35+
b = {2, 3, 4, 5}
36+
c = a.__sub__(b)
37+
d = b.__sub__(a)
38+
assert 1 in c
39+
assert 4 in d
40+
assert 5 in d
41+
42+
e = a - b
43+
f = b - a
44+
assert 1 in c
45+
assert 4 in d
46+
assert 5 in d
47+
48+
doc="__xor__"
49+
a = {1, 2, 3}
50+
b = {2, 3, 4, 5}
51+
c = a.__xor__(b)
52+
assert 1 in c
53+
assert 4 in c
54+
assert 5 in c
55+
56+
d = a ^ b
57+
assert 1 in c
58+
assert 4 in c
59+
assert 5 in c
60+
3361
doc="finished"

0 commit comments

Comments
 (0)