# Created on savesnippets.com ยท https://savesnippets.com/1b2AqZYZxzCGAk from typing import Callable, Hashable, Iterable, Iterator, TypeVar T = TypeVar("T") def unique_everseen[T](items: Iterable[T], key: Callable[[T], Hashable] | None = None) -> Iterator[T]: seen: set[Hashable] = set() for item in items: k = key(item) if key else item # type: ignore[arg-type] if k not in seen: seen.add(k) yield item list(unique_everseen([1, 2, 1, 3, 2, 4])) # [1, 2, 3, 4] emails = ["Bob@X.com", "alice@x.com", "BOB@x.com"] list(unique_everseen(emails, key=str.lower)) # ['Bob@X.com', 'alice@x.com']