@@ -45,7 +45,7 @@ def add(self, node: DoubleLinkedListNode) -> None:
4545 prev = self .rear .prev
4646 if not prev :
4747 raise ValueError ("Invalid list state" )
48-
48+
4949 prev .next = node
5050 node .prev = prev
5151 self .rear .prev = node
@@ -55,7 +55,7 @@ def remove(self, node: DoubleLinkedListNode) -> DoubleLinkedListNode | None:
5555 """Remove node from list"""
5656 if not node .prev or not node .next :
5757 return None
58-
58+
5959 node .prev .next = node .next
6060 node .next .prev = node .prev
6161 node .prev = node .next = None
@@ -116,25 +116,27 @@ def put(self, key: T, value: U) -> None:
116116 @classmethod
117117 def decorator (cls , size : int = 128 ) -> Callable [[Callable [P , R ]], Callable [P , R ]]:
118118 """LRU Cache decorator"""
119+
119120 def decorator_func (func : Callable [P , R ]) -> Callable [P , R ]:
120121 # Create non-generic cache instance
121122 cache = cls (size ) # type: ignore[assignment]
122-
123+
123124 @wraps (func )
124125 def wrapper (* args : P .args , ** kwargs : P .kwargs ) -> R :
125126 key = (args , tuple (sorted (kwargs .items ())))
126127 if (result := cache .get (key )) is None :
127128 result = func (* args , ** kwargs )
128129 cache .put (key , result )
129130 return result
130-
131+
131132 # Add cache_info attribute
132133 wrapper .cache_info = lambda : cache # type: ignore[attr-defined]
133134 return wrapper
134-
135+
135136 return decorator_func
136137
137138
138139if __name__ == "__main__" :
139140 import doctest
141+
140142 doctest .testmod ()
0 commit comments