Skip to content

Commit 591c19d

Browse files
authored
Update lru_cache.py
1 parent a5e3328 commit 591c19d

1 file changed

Lines changed: 16 additions & 19 deletions

File tree

other/lru_cache.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,27 @@
1717
R = TypeVar("R")
1818

1919

20-
class DoubleLinkedListNode(Generic[T, U]):
20+
class DoubleLinkedListNode:
2121
"""Node built for LRU Cache"""
2222

2323
def __init__(self, key: NodeKey, val: NodeValue) -> None:
2424
self.key = key
2525
self.val = val
26-
self.next: DoubleLinkedListNode[T, U] | None = None
27-
self.prev: DoubleLinkedListNode[T, U] | None = None
26+
self.next: DoubleLinkedListNode | None = None
27+
self.prev: DoubleLinkedListNode | None = None
2828

2929
def __repr__(self) -> str:
3030
return f"Node(key={self.key}, val={self.val})"
3131

3232

33-
class DoubleLinkedList(Generic[T, U]):
33+
class DoubleLinkedList:
3434
"""Double Linked List for LRU Cache"""
3535

3636
def __init__(self) -> None:
37-
self.head: DoubleLinkedListNode[Any, Any] = DoubleLinkedListNode(None, None)
38-
self.rear: DoubleLinkedListNode[Any, Any] = DoubleLinkedListNode(None, None)
39-
self.head.next, self.rear.prev = self.rear, self.head
37+
self.head = DoubleLinkedListNode(None, None)
38+
self.rear = DoubleLinkedListNode(None, None)
39+
self.head.next = self.rear
40+
self.rear.prev = self.head
4041

4142
def __repr__(self) -> str:
4243
nodes = []
@@ -46,24 +47,22 @@ def __repr__(self) -> str:
4647
current = current.next
4748
return f"LinkedList({nodes})"
4849

49-
def add(self, node: DoubleLinkedListNode[T, U]) -> None:
50+
def add(self, node: DoubleLinkedListNode) -> None:
5051
"""Add node to list end"""
5152
prev = self.rear.prev
5253
if not prev:
5354
raise ValueError("Invalid list state")
54-
55+
5556
prev.next = node
5657
node.prev = prev
5758
self.rear.prev = node
5859
node.next = self.rear
5960

60-
def remove(
61-
self, node: DoubleLinkedListNode[T, U]
62-
) -> DoubleLinkedListNode[T, U] | None:
61+
def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode | None:
6362
"""Remove node from list"""
6463
if not node.prev or not node.next:
6564
return None
66-
65+
6766
node.prev.next = node.next
6867
node.next.prev = node.prev
6968
node.prev = node.next = None
@@ -74,12 +73,12 @@ class LRUCache(Generic[T, U]):
7473
"""LRU Cache implementation"""
7574

7675
def __init__(self, capacity: int) -> None:
77-
self.list = DoubleLinkedList[T, U]()
76+
self.list = DoubleLinkedList()
7877
self.capacity = capacity
7978
self.size = 0
8079
self.hits = 0
8180
self.misses = 0
82-
self.cache: dict[T, DoubleLinkedListNode[T, U]] = {}
81+
self.cache: dict[T, DoubleLinkedListNode] = {}
8382

8483
def __repr__(self) -> str:
8584
return (
@@ -116,15 +115,14 @@ def put(self, key: T, value: U) -> None:
116115
del self.cache[first.key]
117116
self.size -= 1
118117

119-
new_node: DoubleLinkedListNode[T, U] = DoubleLinkedListNode(key, value)
118+
new_node = DoubleLinkedListNode(key, value)
120119
self.cache[key] = new_node
121120
self.list.add(new_node)
122121
self.size += 1
123122

124123
@classmethod
125124
def decorator(cls, size: int = 128) -> Callable[[Callable[P, R]], Callable[P, R]]:
126125
"""LRU Cache decorator"""
127-
128126
def decorator_func(func: Callable[P, R]) -> Callable[P, R]:
129127
cache = cls[Any, R](size) # type: ignore[type-var]
130128

@@ -139,11 +137,10 @@ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
139137
# Add cache_info attribute
140138
wrapper.cache_info = lambda: cache # type: ignore[attr-defined]
141139
return wrapper
142-
140+
143141
return decorator_func
144142

145143

146144
if __name__ == "__main__":
147145
import doctest
148-
149146
doctest.testmod()

0 commit comments

Comments
 (0)