class OrderedNonUnique(Index): unique = False def __init__(self, key, name=None): super(OrderedNonUnique, self).__init__(key, name) self._data = SortedListWithKey(key=self._getkey) def _insert(self, value): self._data.add(value) def _update(self, old_value, new_value): self._delete(old_value) self._insert(new_value) def _delete(self, value): self._data.remove(value) def __getitem__(self, key): """Not sure if we should return an iterator or a list of values... I'm thinking iterator!""" return self.irange_key(key, key) def __len__(self): return len(self._data) def __contains__(self, value): return value in self._data def __reversed__(self): return reversed(self._data) def __iter__(self): return self._data.irange() def __repr__(self): return self._data.__repr__() def count(self, val): return self._data.count(val) def count_key(self, key): itr = self._data.irange_key(key, key) num_items = 0 for _ in itr: num_items += 1 return num_items def islice(self, start=None, stop=None, reverse=False): return self._data.islice(start, stop, reverse) def irange(self, minimum=None, maximum=None, inclusive=(True, True), reverse=False): return self._data.irange(minimum, maximum, inclusive, reverse) def irange_key(self, min_key=None, max_key=None, inclusive=(True, True), reverse=False): return self._data.irange_key(min_key, max_key, inclusive, reverse)
class Frontier: index = 0 sorted_by_heuristic = None members = None def __init__(self, key=NotImplemented): self.key = key self.sorted_by_heuristic = SortedListWithKey(key=key) self.members = set() def add(self, node): # is the node in the frontier already? if node not in self.members: self.members.add(node) self.sorted_by_heuristic.add(node) def pop(self): node_to_remove = self.sorted_by_heuristic.pop(idx=0) self.members.remove(node_to_remove) return node_to_remove def __contains__(self, node): return node in self.members def __len__(self): return len(self.members) def __iter__(self): return self.sorted_by_heuristic.__iter__() def __next__(self): if self.index == len(self.sorted_by_heuristic) - 1: raise StopIteration else: self.index += 1 return self.sorted_by_heuristic.pop(idx=self.index) def __repr__(self): return self.sorted_by_heuristic.__repr__()