Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/2024_tt_generics'
Browse files Browse the repository at this point in the history
  • Loading branch information
Arjan Egges committed Mar 22, 2024
2 parents 2696cb5 + b78df34 commit a050852
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 0 deletions.
20 changes: 20 additions & 0 deletions 2024/tuesday_tips/generics/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from stack import Stack
from numeric_stack import NumericStack


def main() -> None:
stack = Stack[int]()

stack.push(1)

print(f"Stack of ints: {stack}")

numeric_stack = NumericStack[int]()

numeric_stack.push(1)

print(f"Vector of ints: {numeric_stack}")


if __name__ == "__main__":
main()
34 changes: 34 additions & 0 deletions 2024/tuesday_tips/generics/numeric_stack.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from typing import Literal
from stack import Stack


class NumericStack[T: (int, float)](Stack[T]):
def __getitem__(self, index: int) -> T:
return self._container[index]

def __setitem__(self, index: int, value: T) -> None:
if 0 <= index < len(self._container):
self._container[index] = value
else:
raise IndexError("Stack index out of range")

def sum(self) -> T | Literal[0]:
return sum(self._container)

def average(self) -> float:
if self.is_empty():
return 0

total: T | Literal[0] = self.sum()

return total / self.size()

def max(self) -> T | None:
if self.is_empty():
return None
return max(self._container)

def min(self) -> T | None:
if self.is_empty():
return None
return min(self._container)
74 changes: 74 additions & 0 deletions 2024/tuesday_tips/generics/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions 2024/tuesday_tips/generics/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[tool.poetry]
name = "generics"
version = "0.1.0"
description = ""
authors = ["Andreas Bergman <[email protected]>"]
license = "MIT"
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"


[tool.poetry.group.dev.dependencies]
pytest = "^8.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
26 changes: 26 additions & 0 deletions 2024/tuesday_tips/generics/stack.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from typing import Optional


class Stack[T]:
def __init__(self) -> None:
self._container: list[T] = []

def __str__(self) -> str:
return str(self._container)

def push(self, item: T) -> None:
self._container.append(item)

def pop(self) -> T:
return self._container.pop()

def peek(self) -> Optional[T]:
if self.is_empty():
return None
return self._container[-1]

def is_empty(self) -> bool:
return self._container == []

def size(self) -> int:
return len(self._container)

0 comments on commit a050852

Please sign in to comment.