-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlocal.py
More file actions
61 lines (48 loc) · 1.55 KB
/
Copy pathlocal.py
File metadata and controls
61 lines (48 loc) · 1.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from .base import namedtuple, Key, Map, Queue, Optional, UUID
from bisect import bisect_left
from collections import deque
# inspired by https://code.activestate.com/recipes/577197-sortedcollection/
Revision = namedtuple('Revision', [
'times', # negative UTC milliseconds since epoch
'values' # stored value
])
class LocalMap(Map):
def open(self):
self._map = {}
return self
def _get(self, uuid: UUID, time: int) -> Optional[bytes]:
uuid = uuid.bytes_le
if uuid not in self._map.keys():
return None
else:
revisions = self._map[uuid]
i = bisect_left(revisions.times, -time)
return revisions.values[i]
def _put(self, key: Key, value: bytes) -> Key:
uuid = key.uuid.bytes_le
if uuid not in self._map.keys():
self._map[uuid] = Revision(
times=[-key.time],
values=[value]
)
else:
revisions = self._map[uuid]
i = bisect_left(revisions.times, -key.time)-1
revisions.times.insert(i, -key.time)
revisions.values.insert(i, value)
return key
def close(self):
del(self._map)
return self
class LocalQueue(Queue):
def open(self):
self._queue = deque()
return self
def add(self, kind: str, value: bytes) -> bytes:
self._queue.appendleft(value)
return value
def pop(self) -> bytes:
return self._queue.pop()
def close(self):
del(self._queue)
return self