Skip to content

Commit a80a893

Browse files
update following SRP implementation
1 parent 18d6099 commit a80a893

1 file changed

Lines changed: 34 additions & 22 deletions

File tree

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,73 @@
11
from typing import Optional
22

33
class _Node:
4+
45
def __init__(self, key=None, value=None):
5-
self.key = key
6+
self.key = key
67
self.value = value
78
self.prev: Optional["_Node"] = None
89
self.next: Optional["_Node"] = None
9-
10-
class LruCache:
11-
def __init__(self, limit):
12-
if limit <= 0:
13-
raise ValueError("limit must be positive")
14-
15-
self.limit = limit
16-
self.cache = {}
17-
10+
11+
class DoublyLinkedList:
12+
13+
def __init__(self):
1814
self.head = _Node()
1915
self.tail = _Node()
2016
self.head.next = self.tail
2117
self.tail.prev = self.head
2218

23-
def remove(self, node):
19+
def remove(self, node: _Node):
20+
assert node.prev is not None
21+
assert node.next is not None
2422
node.prev.next = node.next
2523
node.next.prev = node.prev
2624

27-
def add_to_front(self, node):
25+
def add_to_front(self, node: _Node):
2826
next_node = self.head.next
2927
assert next_node is not None
30-
3128
node.next = next_node
3229
node.prev = self.head
3330
next_node.prev = node
3431
self.head.next = node
3532

33+
def remove_last(self) -> _Node:
34+
lru = self.tail.prev
35+
assert lru is not None
36+
self.remove(lru)
37+
return lru
38+
39+
40+
class LruCache:
41+
42+
def __init__(self, limit):
43+
if limit <= 0:
44+
raise ValueError("limit must be positive")
45+
46+
self.limit = limit
47+
self.cache = {}
48+
self.list = DoublyLinkedList()
49+
3650
def get(self, key):
3751
if key not in self.cache:
3852
return None
39-
53+
4054
node = self.cache[key]
41-
self.remove(node)
42-
self.add_to_front(node)
55+
self.list.remove(node)
56+
self.list.add_to_front(node)
4357
return node.value
4458

4559
def set(self, key, value):
4660
if key in self.cache:
4761
node = self.cache[key]
4862
node.value = value
49-
self.remove(node)
50-
self.add_to_front(node)
63+
self.list.remove(node)
64+
self.list.add_to_front(node)
5165
return
5266

5367
node = _Node(key, value)
5468
self.cache[key] = node
55-
self.add_to_front(node)
69+
self.list.add_to_front(node)
5670

5771
if len(self.cache) > self.limit:
58-
lru = self.tail.prev
59-
assert lru is not None
60-
self.remove(lru)
72+
lru = self.list.remove_last()
6173
del self.cache[lru.key]

0 commit comments

Comments
 (0)