aidial_adapter_bedrock/utils/list_projection.py (20 lines of code) (raw):
from dataclasses import dataclass, field
from typing import Generic, Iterable, List, Self, Set, Tuple, TypeVar
_T = TypeVar("_T")
@dataclass
class ListProjection(Generic[_T]):
"""
The class presents a transformation of the original list which may
include merge, removal and addition of the original list elements.
Each derivative element is mapped onto a subset of original elements.
The subsets must be disjoint.
"""
list: List[Tuple[_T, Set[int]]] = field(default_factory=list)
@property
def raw_list(self) -> List[_T]:
return [msg for msg, _ in self.list]
def to_original_indices(self, idx: int | Iterable[int]) -> Set[int]:
return {
orig_index
for index in _to_set(idx)
for orig_index in self.list[index][1]
}
def append(self, elem: _T, idx: int | Iterable[int]) -> Self:
self.list.append((elem, _to_set(idx)))
return self
def _to_set(idx: int | Iterable[int]) -> Set[int]:
return {idx} if isinstance(idx, int) else set(idx)