forge/blade/lib/priorityqueue.py (48 lines of code) (raw):

import heapq, itertools import itertools class PriorityQueue: def __init__(self, capacity, unique=False): self.q, self.items = [], set() self.capacity = capacity self.count = itertools.count() self.unique = unique def get(self, ind): priority, item = self.tolist()[ind] return priority, item def push(self, item, priority, uniqueKey=None): if self.unique: self.items.add(uniqueKey) count = next(self.count) if len(self.q) >= self.capacity: return heapq.heappushpop(self.q, (priority, count, item)) heapq.heappush(self.q, (priority, count, item)) def pop(self): priority, _, item = heapq.heappop(self.q) if self.unique: self.items.remove(item) return priority, item @property def peek(self): return self.peekPriority, self.peekValue @property def peekPriority(self): ret = heapq.nlargest(1, self.q) if len(ret) > 0: return ret[0][0] @property def peekValue(self): ret = heapq.nlargest(1, self.q) if len(ret) > 0: return ret[0][2] def tolist(self): q = heapq.nlargest(self.n, self.q) return [(e[0], e[2]) for e in q] def priorities(self): return sorted([e[0] for e in self.q], reverse=True) def print(self): q = heapq.nlargest(self.n, self.q) print([(e[0]) for e in q], end='') print() @property def n(self): return len(self.q)