Source code for TASSELpy.utils.OrderedSet

from collections import MutableSet

## Set that remembers original insertion order
[docs]class OrderedSet(MutableSet): """ Set that remembers original insertion order Based on the following code: http://code.activestate.com/recipes/576694/ """
[docs] def __init__(self, iterable=None): self.end = end = [] end += [None, end, end] self.map = {} if iterable is not None: self |= iterable
def __len__(self): return len(self.map) def __contains__(self, key): return key in self.map
[docs] def add(self, key): if key not in self.map: end = self.end curr = end[1] curr[2] = end[1] = self.map[key] = [key, curr, end]
[docs] def discard(self, key): if key in self.map: key, prev, next = self.map.pop(key) prev[2] = next next[1] = prev
def __iter__(self): end = self.end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.end curr = end[1] while curr is not end: yield curr[0] curr = curr[1]
[docs] def pop(self, last=True): if not self: raise KeyError("set is empty") key = self.end[1][0] if last else self.end[2][0] self.discard(key) return key
def __repr__(self): if not self: return "%s()" % (self.__class__.__name__,) return "%s(%r)" % (self.__class__.__name__,list(self)) def __eq__(self, other): if isinstance(other, OrderedSet): return len(self) == len(other) and list(self) == list(other) return set(self) == set(other) ## Ordered set that also acts as an LRU cache
[docs]class lruOrderedSet(OrderedSet):
[docs] def __init__(self, maxSize = 1000, iterable = None): super(lruOrderedSet,self).__init__(iterable=iterable) self.maxSize = maxSize
[docs] def add(self, key): if len(self) >= self.maxSize: discard = self.pop(last=False) super(lruOrderedSet, self).add(key)