Beispiel #1
0
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__()