#! /usr/bin/python # maybe Producer is a better name then Server? class UniqItemServer(list): def __init__(self, values): list.__init__(self, values) self._index = 0 def append(self, value): if value not in self: self += [value] def item_generator(self): while self._index < len(self)-1: idx = self._index self._index += 1 yield self[idx] try: item = self[self._index] except IndexError: raise StopIteration self._index += 1 yield item if __name__ == '__main__': if 1: uis = UniqItemServer([]) uis.append(1) uis.append(1) uis.append(1) uis.append(1) uis.append(1) assert(uis == [1]) uis.append(1) uis.append(2) uis.append(2) uis.append(3) uis.append(3) assert(uis == [1, 2, 3]) uis_gen = uis.item_generator() assert(uis_gen.next() == 1) assert(uis_gen.next() == 2) assert(uis_gen.next() == 3) try: uis_gen.next() except StopIteration: # reset generator uis_gen = uis.item_generator() uis.append(4) uis.append(5) uis.append(5) uis.append(6) uis.append(6) uis_gen.next() assert(uis_gen.next() == 4) assert(uis_gen.next() == 5) assert(uis_gen.next() == 6) stop = False try: uis_gen.next() except StopIteration: stop = True assert(stop == True) uis = UniqItemServer([]) uis_gen = uis.item_generator() uis.append(1) uis.append(2) uis.append(2) uis.append(3) uis.append(3) assert(uis_gen.next() == 1) assert(uis_gen.next() == 2) assert(uis_gen.next() == 3) uis_gen = uis.item_generator() uis.append(4) uis.append(5) uis.append(5) uis.append(6) uis.append(6) uis_gen = uis.item_generator() assert(uis_gen.next() == 4) assert(uis_gen.next() == 5) uis.append(7) uis.append(8) uis_gen = uis.item_generator() assert(uis_gen.next() == 6) assert(uis_gen.next() == 7) uis_gen = uis.item_generator() assert(uis_gen.next() == 8)