def pop(self) -> T:
     if self.is_empty():
         raise IndexError("pop on empty stack")
     else:
         item: T = self._stacks.peek().pop()
         if self._stacks.peek().is_empty():
             self._stacks.pop()
             if self._stacks.is_empty():
                 self._stacks = Stack(Stack())
         return item
 def __init__(self, max_stack_size: int, items: List[T] = []) -> None:
     if max_stack_size < 1:
         raise ValueError("illegal max_stack_size: {}".format(max_stack_size))
     if items == []:
         items = []  # avoid issues with mutable default args
     self._max_stack_size = max_stack_size
     self._stacks: Stack[Stack[T]] = Stack(Stack())
     self._remaining_space = max_stack_size
     for item in items:
         if self._remaining_space == 0:
             self._stacks.push(Stack())
             self._remaining_space = self._max_stack_size
         self._stacks.peek().push(item)
         self._remaining_space -= 1
 def push(self, item: T) -> None:
     if self._remaining_space == 0:
         self._stacks.push(Stack())
         self._remaining_space = self._max_stack_size
     self._stacks.peek().push(item)
     self._remaining_space -= 1
     return
def test_iter():
    ll_iter = Stack(10, 11, 12).__iter__()
    assert ll_iter.__next__() == 12
    assert ll_iter.__next__() == 11
    assert ll_iter.__next__() == 10
    with pytest.raises(StopIteration):
        ll_iter.__next__()
    with pytest.raises(StopIteration):
        ll_iter.__next__()
def test_sorted_does_not_mutate():
    stack = Stack(10, 1, 5, 7)
    stack.sorted()
    assert stack == Stack(10, 1, 5, 7)
def test_sorted():
    assert Stack(10, 1, 5, 7).sorted() == Stack(1, 5, 7, 10)
    assert Stack(10, 1, 7, 5, 7).sorted() == Stack(1, 5, 7, 7, 10)
    assert Stack().sorted() == Stack()
    assert Stack(5).sorted() == Stack(5)
    assert Stack(5, 6).sorted() == Stack(5, 6)
    assert Stack(6, 5).sorted() == Stack(5, 6)
def test_push():
    stack = Stack[int]()
    stack.push(10)
    stack.push(11)
    stack.push(12)
    assert stack == Stack(10, 11, 12)
def test_is_empty():
    assert Stack(10, 11, 12).is_empty() is False
    assert Stack(10).is_empty() is False
    assert Stack().is_empty() is True
def test_eq():
    assert Stack(10, 11, 12, 13) == Stack(10, 11, 12, 13)
    assert Stack() == Stack()
    assert Stack() != Stack(10)
    assert Stack(10, 11, 12, 13) != Stack(10, 11, 12)
    assert Stack(10, 11, 12, 13) != Stack(11, 12, 13)
    assert Stack() != []
    assert Stack() is not None
def test_len():
    assert len(Stack(10, 11, 12, 13)) == 4
def test_to_str():
    assert str(Stack()) == "Stack()"
    assert str(Stack(10)) == "Stack(10)"
    assert str(Stack(10, 11)) == "Stack(11, 10)"
def test_to_list():
    assert list(Stack(10, 11, 12)) == [12, 11, 10]
class SetOfStacks(Generic[T]):
    def __init__(self, max_stack_size: int, items: List[T] = []) -> None:
        if max_stack_size < 1:
            raise ValueError("illegal max_stack_size: {}".format(max_stack_size))
        if items == []:
            items = []  # avoid issues with mutable default args
        self._max_stack_size = max_stack_size
        self._stacks: Stack[Stack[T]] = Stack(Stack())
        self._remaining_space = max_stack_size
        for item in items:
            if self._remaining_space == 0:
                self._stacks.push(Stack())
                self._remaining_space = self._max_stack_size
            self._stacks.peek().push(item)
            self._remaining_space -= 1

    def pop(self) -> T:
        if self.is_empty():
            raise IndexError("pop on empty stack")
        else:
            item: T = self._stacks.peek().pop()
            if self._stacks.peek().is_empty():
                self._stacks.pop()
                if self._stacks.is_empty():
                    self._stacks = Stack(Stack())
            return item

    def peek(self) -> T:
        if self.is_empty() is None:
            raise IndexError("pop on empty stack")
        else:
            return self._stacks.peek().peek()

    def push(self, item: T) -> None:
        if self._remaining_space == 0:
            self._stacks.push(Stack())
            self._remaining_space = self._max_stack_size
        self._stacks.peek().push(item)
        self._remaining_space -= 1
        return

    def is_empty(self) -> bool:
        return self._stacks.peek().is_empty()

    def __str__(self) -> str:
        items = "" if self.is_empty() else ", [{}]".format(", ".join([str(v) for v in list(self)]))
        return "SetOfStacks({}{})".format(self._max_stack_size, items)

    def __len__(self) -> int:
        out = 0
        for _ in self:
            out += 1
        return out

    def __eq__(self, other: Any) -> bool:
        return (
            other is not None and
            type(other) is SetOfStacks and
            self._max_stack_size == other._max_stack_size and
            list(self) == list(other)
        )

    def __iter__(self) -> SetOfStacksIterator[T]:
        return SetOfStacksIterator[T](self)