Source code for titan_pylib.data_structures.deque.foldable_deque

 1from titan_pylib.data_structures.stack.foldable_stack import FoldableStack
 2from typing import Generic, Iterable, TypeVar, Callable, Union
 3
 4T = TypeVar("T")
 5
 6
[docs] 7class FoldableDeque(Generic[T]): 8 9 def __init__( 10 self, n_or_a: Union[int, Iterable[T]], op: Callable[[T, T], T], e: T 11 ) -> None: 12 self._op = op 13 self._e = e 14 self.front: FoldableStack[T] = FoldableStack(0, op, e) 15 self.back: FoldableStack[T] = FoldableStack(n_or_a, op, e) 16 17 def _rebuild(self) -> None: 18 new = self.front.tolist()[::-1] + self.back.tolist() 19 self.front = FoldableStack(new[: len(new) // 2][::-1], self._op, self._e) 20 self.back = FoldableStack(new[len(new) // 2 :], self._op, self._e) 21
[docs] 22 def tolist(self) -> list[T]: 23 return self.front.tolist()[::-1] + self.back.tolist()
24
[docs] 25 def append(self, v: T) -> None: 26 self.back.append(v)
27
[docs] 28 def appendleft(self, v: T) -> None: 29 self.front.append(v)
30
[docs] 31 def pop(self) -> T: 32 if not self.back: 33 self._rebuild() 34 return self.back.pop() if self.back else self.front.pop()
35
[docs] 36 def popleft(self) -> T: 37 if not self.front: 38 self._rebuild() 39 return self.front.pop() if self.front else self.back.pop()
40
[docs] 41 def all_prod(self) -> T: 42 return self._op(self.front.all_prod(), self.back.all_prod())
43 44 def __len__(self): 45 return len(self.front) + len(self.back)