Source code for pythonwrench.collections.prop
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from typing import (
Any,
Callable,
Iterable,
Literal,
Optional,
TypeVar,
)
from pythonwrench.functools import function_alias
K = TypeVar("K", covariant=True)
T = TypeVar("T", covariant=True)
U = TypeVar("U", covariant=True)
V = TypeVar("V", covariant=True)
W = TypeVar("W", covariant=True)
X = TypeVar("X", covariant=True)
Y = TypeVar("Y", covariant=True)
KeyMode = Literal["intersect", "same", "union"]
Order = Literal["left", "right"]
[docs]
def all_eq(it: Iterable[T], eq_fn: Optional[Callable[[T, T], bool]] = None) -> bool:
"""Returns true if all elements in iterable are equal.
Note: This function returns True for iterable that contains 0 or 1 element.
"""
it = list(it)
try:
first = next(iter(it))
except StopIteration:
return True
if eq_fn is None:
return all(first == elt for elt in it)
else:
return all(eq_fn(first, elt) for elt in it)
[docs]
def all_ne(
it: Iterable[T],
ne_fn: Optional[Callable[[T, T], bool]] = None,
use_set: bool = False,
) -> bool:
"""Returns true if all elements in iterable are differents.
Note: This function returns True for iterable that contains 0 or 1 element.
"""
if isinstance(it, (set, frozenset, dict)):
return True
if use_set and ne_fn is not None:
raise ValueError(f"Cannot use arguments {use_set=} with {ne_fn=}.")
it = list(it)
if use_set:
return len(it) == len(set(it))
elif ne_fn is None:
return all(
it[i] != it[j] for i in range(len(it)) for j in range(i + 1, len(it))
)
else:
return all(
ne_fn(it[i], it[j]) for i in range(len(it)) for j in range(i + 1, len(it))
)
[docs]
@function_alias(all_eq)
def is_full(*args, **kwargs): ...
[docs]
def is_sorted(
x: Iterable[Any],
*,
reverse: bool = False,
strict: bool = False,
) -> bool:
it = iter(x)
try:
prev = next(it)
except StopIteration:
return True
for xi in it:
if not reverse and prev > xi:
return False
if reverse and prev < xi:
return False
if strict and prev == xi:
return False
prev = xi
return True
[docs]
@function_alias(all_ne)
def is_unique(*args, **kwargs): ...