Skip to content

Instantly share code, notes, and snippets.

@FFY00
Last active August 27, 2021 01:07
Show Gist options
  • Save FFY00/04f52202483d1ccac8e4db2b6534c025 to your computer and use it in GitHub Desktop.
Save FFY00/04f52202483d1ccac8e4db2b6534c025 to your computer and use it in GitHub Desktop.
import typing
from typing import Generic, List, Optional, Set
T = typing.TypeVar('T')
class Grouper(Generic[T]):
def __init__(self) -> None:
self.groups: List[Set[T]] = []
def _new_group(self) -> Set[T]:
group: Set[T] = set()
self.groups.append(group)
return group
def add(self, *values: T) -> None:
# build group list
groups = list(filter(None, [
self.group_of(value) for value in values
]))
if not groups:
groups.append(self._new_group())
# merge groups into the first
target = groups[0]
for merge_group in groups[1:]:
if merge_group is not target:
self.groups.remove(merge_group)
target.update(merge_group)
# add the values to the group
target.update(values)
def group_of(self, value: T) -> Optional[Set[T]]:
for group in self.groups:
if value in group:
return group
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment