Do you want my frozenset implemenation using this lib?
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 20/100
Research direction
Review the proposed ImmutableSet class and its create, add, remove, contains, union, and intersection functions, along with the included tests. First determine whether the project wants to add this abstraction and where it would belong; the issue does not define an acceptance criterion or project location. Done would require maintainer agreement on the API, integration scope, and tests.
Written by the indexing model from the issue text.
Description
if you do here it is:
from typing import Iterable
import immutables
# Design choices:
# - Using a class to allow for typing
# - The class has no methods to ensure all logic is in the functions below.
# - The wrapped map is kept private.
# - To prevent the user from making subtle mistake, we override `__eq__` to raise an error.
# Corollaries:
# - Will not work with operators ootb, e.g. `in`, `==` or `len`.
class ImmutableSet:
def __init__(self, inner):
self._inner = inner
def __eq__(self, _):
raise NotImplementedError(
"Use the functions in this module instead of operators.",
)
def create(iterable: Iterable) -> ImmutableSet:
return ImmutableSet(immutables.Map(map(lambda x: (x, None), iterable)))
EMPTY: ImmutableSet = create([])
def equals(s1: ImmutableSet, s2: ImmutableSet) -> bool:
return s1._inner == s2._inner # noqa: SF01
def length(set: ImmutableSet) -> int:
return len(set._inner) # noqa: SF01
def add(set: ImmutableSet, element) -> ImmutableSet:
return ImmutableSet(set._inner.set(element, None)) # noqa: SF01
def remove(set: ImmutableSet, element) -> ImmutableSet:
return ImmutableSet(set._inner.delete(element)) # noqa: SF01
def contains(set: ImmutableSet, element) -> bool:
return element in set._inner # noqa: SF01
def union(set1: ImmutableSet, set2: ImmutableSet) -> ImmutableSet:
smaller, larger = sorted([set1, set2], key=length)
return ImmutableSet(larger._inner.update(smaller._inner)) # noqa: SF01
def intersection(set1: ImmutableSet, set2: ImmutableSet) -> ImmutableSet:
smaller, larger = sorted([set1, set2], key=length)
for element in smaller._inner: # noqa: SF01
if not contains(larger, element):
smaller = remove(smaller, element)
return smaller
and tests:
import time
def test_add():
assert immutable_set.equals(
immutable_set.add(
immutable_set.create([1, 2, 3]),
4,
),
immutable_set.create(
[1, 2, 3, 4],
),
)
def test_remove():
assert immutable_set.equals(
immutable_set.remove(
immutable_set.create([1, 2, 3]),
2,
),
immutable_set.create([1, 3]),
)
def test_contains():
assert immutable_set.contains(immutable_set.create([1, 2, 3]), 3)
def test_not_contains():
assert not immutable_set.contains(immutable_set.create([1, 2, 3]), 4)
def test_union():
assert immutable_set.equals(
immutable_set.union(
immutable_set.create([1, 2, 3, 4]),
immutable_set.create([1, 2, 3]),
),
immutable_set.create([1, 2, 3, 4]),
)
def _is_o_of_1(f, arg1, arg2):
start = time.perf_counter()
f(arg1, arg2)
return time.perf_counter() - start < 0.0001
_large_number = 9999
def test_intersection():
assert immutable_set.equals(
immutable_set.intersection(
immutable_set.create([1, 2]),
immutable_set.create([2]),
),
immutable_set.create([2]),
)
def test_performance_sanity():
assert not _is_o_of_1(
immutable_set.union,
immutable_set.create(range(_large_number)),
immutable_set.create(range(_large_number)),
)
def test_union_performance():
assert _is_o_of_1(
immutable_set.union,
immutable_set.create(range(_large_number)),
immutable_set.create(range(_large_number // 64, _large_number // 32)),
)
def test_intersection_performance():
assert _is_o_of_1(
immutable_set.intersection,
immutable_set.create(range(_large_number)),
immutable_set.create(range(1)),
)
- Dominant language
- C
- Stars
- 1.2k
- Forks
- 60
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from MagicStack/immutables
-
Difficulty 3/5 1-2 days Newbie friendliness 38/100
MagicStack/immutables#121 · 6 reactions ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
MagicStack/immutables#107 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 32/100
MagicStack/immutables#102 ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
MagicStack/immutables#75 · 1 comment ·
-
Difficulty 5/5 Over a week Newbie friendliness 30/100
MagicStack/immutables#55 · 3 comments ·
All issues in MagicStack/immutables
Similar issues
-
level/task module/gcp type/bug
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
-
Difficulty 1/5 Under an hour Newbie friendliness 86/100
hapostgres/pg_auto_failover#1190 ·
-
docs
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
P3 sonic-vpp
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
sonic-net/sonic-buildimage#29662 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 94/100
spack/spack-packages#6586 ·