Skip to content

Commit dd14ce9

Browse files
committed
Fill out Set interface - preliminary implementation only
1 parent 5a8a876 commit dd14ce9

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

py/set.go

+42-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
package py
66

7-
var SetType = NewType("set", "set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.")
7+
var SetType = NewTypeX("set", "set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unordered collection of unique elements.", SetNew, nil)
88

99
type SetValue struct{}
1010

@@ -45,6 +45,17 @@ func (s *Set) Add(item Object) {
4545
s.items[item] = SetValue{}
4646
}
4747

48+
// SetNew
49+
func SetNew(metatype *Type, args Tuple, kwargs StringDict) Object {
50+
var iterable Object
51+
UnpackTuple(args, kwargs, "set", 0, 1, &iterable)
52+
if iterable == nil {
53+
return NewSet()
54+
}
55+
// FIXME should be able to initialise from an iterable!
56+
return NewSetFromItems(iterable.(Tuple))
57+
}
58+
4859
var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.")
4960

5061
type FrozenSet struct {
@@ -69,3 +80,33 @@ func NewFrozenSetFromItems(items []Object) *FrozenSet {
6980
Set: *NewSetFromItems(items),
7081
}
7182
}
83+
84+
// Extend the set with items
85+
func (s *Set) Update(items []Object) {
86+
for _, item := range items {
87+
s.items[item] = SetValue{}
88+
}
89+
}
90+
91+
func (s *Set) M__len__() Object {
92+
return Int(len(s.items))
93+
}
94+
95+
func (s *Set) M__bool__() Object {
96+
return NewBool(len(s.items) > 0)
97+
}
98+
99+
func (s *Set) M__iter__() Object {
100+
items := make(Tuple, 0, len(s.items))
101+
for item := range s.items {
102+
items = append(items, item)
103+
}
104+
return NewIterator(items)
105+
}
106+
107+
// Check interface is satisfied
108+
var _ I__len__ = (*Set)(nil)
109+
var _ I__bool__ = (*Set)(nil)
110+
var _ I__iter__ = (*Set)(nil)
111+
112+
// var _ richComparison = (*Set)(nil)

0 commit comments

Comments
 (0)