diff --git a/py/sequence.go b/py/sequence.go index 53e78295..430471c8 100644 --- a/py/sequence.go +++ b/py/sequence.go @@ -43,6 +43,26 @@ func SequenceList(v Object) (*List, error) { } } +// Converts a sequence object v into a Set +func SequenceSet(v Object) (*Set, error) { + switch x := v.(type) { + case Tuple: + return NewSetFromItems(x), nil + case *List: + return NewSetFromItems(x.Items), nil + default: + s := NewSet() + err := Iterate(v, func(item Object) bool { + s.Add(item) + return false + }) + if err != nil { + return nil, err + } + return s, nil + } +} + // Call __next__ for the python object // // Returns the next object diff --git a/py/set.go b/py/set.go index a27143ba..a09cc8d2 100644 --- a/py/set.go +++ b/py/set.go @@ -56,11 +56,10 @@ func SetNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) { if err != nil { return nil, err } - if iterable == nil { - return NewSet(), nil + if iterable != nil { + return SequenceSet(iterable) } - // FIXME should be able to initialise from an iterable! - return NewSetFromItems(iterable.(Tuple)), nil + return NewSet(), nil } var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.") diff --git a/py/tests/set.py b/py/tests/set.py index f6fa539a..f2f867a7 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -55,6 +55,20 @@ d = a ^ b assert 1 in c + +doc="set" +a = set([1,2,3]) +b = set("set") +c = set((4,5)) +assert len(a) == 3 +assert len(b) == 3 +assert len(c) == 2 +assert 1 in a +assert 2 in a +assert 3 in a +assert "s" in b +assert "e" in b +assert "t" in b assert 4 in c assert 5 in c