From 7d566b87d82fd69246a5bc491505b09af318200f Mon Sep 17 00:00:00 2001 From: SanggiHong Date: Sun, 29 Sep 2019 15:56:29 +0900 Subject: [PATCH 1/4] set: Implement initialization set with sequence --- py/sequence.go | 20 ++++++++++++++++++++ py/set.go | 7 ++++--- py/tests/set.py | 12 ++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) 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..cf118be7 100644 --- a/py/set.go +++ b/py/set.go @@ -56,11 +56,12 @@ 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) } + return NewSet(), nil // FIXME should be able to initialise from an iterable! - return NewSetFromItems(iterable.(Tuple)), nil + // return NewSetFromItems(iterable.(Tuple)), 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..34c227f6 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -55,6 +55,18 @@ d = a ^ b assert 1 in c + +doc="set" +a = set([1,2,3]) +b = set("set") +c = set((4,5)) +assert 1 in a +assert 2 in a +assert 3 in a +assert "s" in b +assert "e" in b +assert "t" in b +>>>>>>> set-init-with-list assert 4 in c assert 5 in c From b64c1d23669da7a7f3ac4cb0436b05cfc8d5674b Mon Sep 17 00:00:00 2001 From: SanggiHong Date: Sun, 29 Sep 2019 16:03:24 +0900 Subject: [PATCH 2/4] Remove comment --- py/set.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/py/set.go b/py/set.go index cf118be7..a09cc8d2 100644 --- a/py/set.go +++ b/py/set.go @@ -60,8 +60,6 @@ func SetNew(metatype *Type, args Tuple, kwargs StringDict) (Object, error) { return SequenceSet(iterable) } return NewSet(), nil - // FIXME should be able to initialise from an iterable! - // return NewSetFromItems(iterable.(Tuple)), nil } var FrozenSetType = NewType("frozenset", "frozenset() -> empty frozenset object\nfrozenset(iterable) -> frozenset object\n\nBuild an immutable unordered collection of unique elements.") From bfd0cb301a7944e36008bfda1782d5ee0b378d73 Mon Sep 17 00:00:00 2001 From: SanggiHong Date: Sun, 29 Sep 2019 16:09:35 +0900 Subject: [PATCH 3/4] Remove typo --- py/tests/set.py | 1 - 1 file changed, 1 deletion(-) diff --git a/py/tests/set.py b/py/tests/set.py index 34c227f6..4bcca49b 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -66,7 +66,6 @@ assert "s" in b assert "e" in b assert "t" in b ->>>>>>> set-init-with-list assert 4 in c assert 5 in c From 130d715354caf41a3a3567ef9c373b4fbfd564b3 Mon Sep 17 00:00:00 2001 From: SanggiHong Date: Sun, 29 Sep 2019 16:53:18 +0900 Subject: [PATCH 4/4] set: Improve test code --- py/tests/set.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/py/tests/set.py b/py/tests/set.py index 4bcca49b..f2f867a7 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -60,6 +60,9 @@ 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