Fixed a bug in the expire method
This commit is contained in:
parent
ddb60115f8
commit
620692561d
|
@ -53,13 +53,12 @@ class TTLQueue:
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
n = len(self._queue)
|
n = len(self._queue)
|
||||||
while i < n:
|
while i < n: # Not the nicest-looking way of doing it, but surely works and is efficient
|
||||||
try:
|
item = self._queue[i]
|
||||||
item = self._queue[i]
|
|
||||||
except IndexError:
|
|
||||||
break
|
|
||||||
if item.date <= when:
|
if item.date <= when:
|
||||||
del self._queue[i]
|
self._queue.remove(item)
|
||||||
|
n = len(self._queue)
|
||||||
|
i -= 1
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
def put(self, element, ttl: int = 0):
|
def put(self, element, ttl: int = 0):
|
||||||
|
@ -155,7 +154,7 @@ class TTLStack:
|
||||||
ttl = ttl if ttl else self.ttl
|
ttl = ttl if ttl else self.ttl
|
||||||
self.expire(self.timer())
|
self.expire(self.timer())
|
||||||
if len(self._stack) < self.size:
|
if len(self._stack) < self.size:
|
||||||
self._stack.appendleft((self.timer() + ttl, element))
|
self._stack.appendleft(TTLItem(element, self.timer() + ttl))
|
||||||
else:
|
else:
|
||||||
raise StackFull("The stack is full!")
|
raise StackFull("The stack is full!")
|
||||||
|
|
||||||
|
@ -169,13 +168,13 @@ class TTLStack:
|
||||||
self.expire(self.timer())
|
self.expire(self.timer())
|
||||||
if not self._stack:
|
if not self._stack:
|
||||||
raise StackEmpty("The stack is empty!")
|
raise StackEmpty("The stack is empty!")
|
||||||
return self._stack.popleft()[1]
|
return self._stack.popleft().obj
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
"""Implements repr(self)"""
|
"""Implements repr(self)"""
|
||||||
|
|
||||||
string = "TTLStack({list}, size={qsize}, ttl={ttl}, timer={timer})"
|
string = "TTLStack({list}, size={qsize}, ttl={ttl}, timer={timer})"
|
||||||
values = [t[1] for t in self._stack]
|
values = [t.obj for t in self._stack]
|
||||||
return string.format(list=values, qsize=self.size, ttl=self.ttl, timer=self.timer)
|
return string.format(list=values, qsize=self.size, ttl=self.ttl, timer=self.timer)
|
||||||
|
|
||||||
def expire(self, when: int):
|
def expire(self, when: int):
|
||||||
|
@ -190,13 +189,12 @@ class TTLStack:
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
n = len(self._stack)
|
n = len(self._stack)
|
||||||
while i < n: # Using a for loop would raise RuntimeError
|
while i < n:
|
||||||
try:
|
item = self._stack[i]
|
||||||
date, element = self._stack[i]
|
if item.date <= when:
|
||||||
except IndexError:
|
self._stack.remove(item)
|
||||||
break
|
n = len(self._stack)
|
||||||
if date <= when:
|
i -= 1
|
||||||
del self._stack[i]
|
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
|
@ -284,7 +282,12 @@ class TTLHeap(TTLQueue):
|
||||||
:type when: int
|
:type when: int
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for item in self._queue:
|
i = 0
|
||||||
|
n = len(self._queue)
|
||||||
|
while i < n:
|
||||||
|
item = self._queue[i]
|
||||||
if item.date <= when:
|
if item.date <= when:
|
||||||
self._queue.remove(item)
|
self._queue.remove(item)
|
||||||
|
n = len(self._queue)
|
||||||
|
i -= 1
|
||||||
|
i += 1
|
||||||
|
|
Loading…
Reference in New Issue