Mercurial > repos > guerler > springsuite
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) |