comparison planemo/lib/python3.7/site-packages/galaxy/util/oset.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 """
2 Ordered set implementation from https://code.activestate.com/recipes/576694/
3 """
4 import collections
5
6
7 class OrderedSet(collections.MutableSet):
8 def __init__(self, iterable=None):
9 self.end = end = []
10 end += [None, end, end] # sentinel node for doubly linked list
11 self.map = {} # key --> [key, prev, next]
12 if iterable is not None:
13 self |= iterable
14
15 def __len__(self):
16 return len(self.map)
17
18 def __contains__(self, key):
19 return key in self.map
20
21 def add(self, key):
22 if key not in self.map:
23 end = self.end
24 curr = end[1]
25 curr[2] = end[1] = self.map[key] = [key, curr, end]
26
27 def discard(self, key):
28 if key in self.map:
29 key, prev, next = self.map.pop(key)
30 prev[2] = next
31 next[1] = prev
32
33 def __iter__(self):
34 end = self.end
35 curr = end[2]
36 while curr is not end:
37 yield curr[0]
38 curr = curr[2]
39
40 def __reversed__(self):
41 end = self.end
42 curr = end[1]
43 while curr is not end:
44 yield curr[0]
45 curr = curr[1]
46
47 def pop(self, last=True):
48 if not self:
49 raise KeyError('set is empty')
50 key = self.end[1][0] if last else self.end[2][0]
51 self.discard(key)
52 return key
53
54 def __repr__(self):
55 if not self:
56 return '%s()' % (self.__class__.__name__,)
57 return '%s(%r)' % (self.__class__.__name__, list(self))
58
59 def __eq__(self, other):
60 if isinstance(other, OrderedSet):
61 return len(self) == len(other) and list(self) == list(other)
62 return set(self) == set(other)