1717R = 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
146144if __name__ == "__main__" :
147145 import doctest
148-
149146 doctest .testmod ()
0 commit comments