@@ -45,7 +45,7 @@ def add(self, node: DoubleLinkedListNode) -> None:
45
45
prev = self .rear .prev
46
46
if not prev :
47
47
raise ValueError ("Invalid list state" )
48
-
48
+
49
49
prev .next = node
50
50
node .prev = prev
51
51
self .rear .prev = node
@@ -55,7 +55,7 @@ def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode | None:
55
55
"""Remove node from list"""
56
56
if not node .prev or not node .next :
57
57
return None
58
-
58
+
59
59
node .prev .next = node .next
60
60
node .next .prev = node .prev
61
61
node .prev = node .next = None
@@ -116,25 +116,27 @@ def put(self, key: T, value: U) -> None:
116
116
@classmethod
117
117
def decorator (cls , size : int = 128 ) -> Callable [[Callable [P , R ]], Callable [P , R ]]:
118
118
"""LRU Cache decorator"""
119
+
119
120
def decorator_func (func : Callable [P , R ]) -> Callable [P , R ]:
120
121
# Create non-generic cache instance
121
122
cache = cls (size ) # type: ignore[assignment]
122
-
123
+
123
124
@wraps (func )
124
125
def wrapper (* args : P .args , ** kwargs : P .kwargs ) -> R :
125
126
key = (args , tuple (sorted (kwargs .items ())))
126
127
if (result := cache .get (key )) is None :
127
128
result = func (* args , ** kwargs )
128
129
cache .put (key , result )
129
130
return result
130
-
131
+
131
132
# Add cache_info attribute
132
133
wrapper .cache_info = lambda : cache # type: ignore[attr-defined]
133
134
return wrapper
134
-
135
+
135
136
return decorator_func
136
137
137
138
138
139
if __name__ == "__main__" :
139
140
import doctest
141
+
140
142
doctest .testmod ()
0 commit comments