@@ -40,7 +40,7 @@ def add(self, node: DoubleLinkedListNode) -> None:
40
40
prev = self .rear .prev
41
41
if prev is None :
42
42
return
43
-
43
+
44
44
# Insert node between prev and rear
45
45
prev .next = node
46
46
node .prev = prev
@@ -51,11 +51,11 @@ def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode | None:
51
51
"""Remove node from list"""
52
52
if node .prev is None or node .next is None :
53
53
return None
54
-
54
+
55
55
# Bypass node
56
56
node .prev .next = node .next
57
57
node .next .prev = node .prev
58
-
58
+
59
59
# Clear node references
60
60
node .prev = None
61
61
node .next = None
@@ -97,7 +97,7 @@ def put(self, key: Any, value: Any) -> None:
97
97
node .val = value
98
98
self .list .add (node )
99
99
return
100
-
100
+
101
101
# Evict LRU item if at capacity
102
102
if self .size >= self .capacity :
103
103
# head.next may be None, so annotate as Optional
@@ -110,7 +110,7 @@ def put(self, key: Any, value: Any) -> None:
110
110
):
111
111
del self .cache [first_node .key ]
112
112
self .size -= 1
113
-
113
+
114
114
# Add new node
115
115
new_node = DoubleLinkedListNode (key , value )
116
116
self .cache [key ] = new_node
@@ -132,22 +132,21 @@ def lru_cache(maxsize: int = 128) -> Callable[[Callable[P, R]], Callable[P, R]]:
132
132
def wrapper (* args : P .args , ** kwargs : P .kwargs ) -> R :
133
133
# Create normalized cache key
134
134
key = (args , tuple (sorted (kwargs .items ())))
135
-
135
+
136
136
# Try to get cached result
137
137
cached = cache .get (key )
138
138
if cached is not None :
139
139
return cast (R , cached )
140
-
140
+
141
141
# Compute and cache result
142
142
result = func (* args , ** kwargs )
143
143
cache .put (key , result )
144
144
return result
145
-
145
+
146
146
# Attach cache info method
147
147
wrapper .cache_info = cache .cache_info # type: ignore[attr-defined]
148
148
return wrapper
149
149
150
150
return decorator
151
151
152
152
if name == "main" : import doctest doctest .testmod ()
153
-
0 commit comments