devve1 commited on
Commit
19aff28
1 Parent(s): 4d74cf4

Create weak_list.py

Browse files
Files changed (1) hide show
  1. weak_list.py +97 -0
weak_list.py ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import weakref
2
+
3
+ class WeakList(list):
4
+ def __init__(self, seq=()):
5
+ list.__init__(self)
6
+ self._refs = []
7
+ self._dirty=False
8
+ for x in seq: self.append(x)
9
+
10
+ def _mark_dirty(self, wref):
11
+ self._dirty = True
12
+
13
+ def flush(self):
14
+ self._refs = [x for x in self._refs if x() is not None]
15
+ self._dirty=False
16
+
17
+ def __getitem__(self, idx):
18
+ if self._dirty: self.flush()
19
+ return self._refs[idx]()
20
+
21
+ def __iter__(self):
22
+ for ref in self._refs:
23
+ obj = ref()
24
+ if obj is not None: yield obj
25
+
26
+ def __repr__(self):
27
+ return "WeakList(%r)" % list(self)
28
+
29
+ def __len__(self):
30
+ if self._dirty: self.flush()
31
+ return len(self._refs)
32
+
33
+ def __setitem__(self, idx, obj):
34
+ if isinstance(idx, slice):
35
+ self._refs[idx] = [weakref.ref(obj, self._mark_dirty) for x in obj]
36
+ else:
37
+ self._refs[idx] = weakref.ref(obj, self._mark_dirty)
38
+
39
+ def __delitem__(self, idx):
40
+ del self._refs[idx]
41
+
42
+ def append(self, obj):
43
+ self._refs.append(weakref.ref(obj, self._mark_dirty))
44
+
45
+ def count(self, obj):
46
+ return list(self).count(obj)
47
+
48
+ def extend(self, items):
49
+ for x in items: self.append(x)
50
+
51
+ def index(self, obj):
52
+ return list(self).index(obj)
53
+
54
+ def insert(self, idx, obj):
55
+ self._refs.insert(idx, weakref.ref(obj, self._mark_dirty))
56
+
57
+ def pop(self, idx):
58
+ if self._dirty: self.flush()
59
+ obj=self._refs[idx]()
60
+ del self._refs[idx]
61
+ return obj
62
+
63
+ def remove(self, obj):
64
+ if self._dirty: self.flush() # Ensure all valid.
65
+ for i, x in enumerate(self):
66
+ if x == obj:
67
+ del self[i]
68
+
69
+ def reverse(self):
70
+ self._refs.reverse()
71
+
72
+ def sort(self, cmp=None, key=None, reverse=False):
73
+ if self._dirty: self.flush()
74
+ if key is not None:
75
+ key = lambda x,key=key: key(x())
76
+ else:
77
+ key = apply
78
+ self._refs.sort(cmp=cmp, key=key, reverse=reverse)
79
+
80
+ def __add__(self, other):
81
+ l = WeakList(self)
82
+ l.extend(other)
83
+ return l
84
+
85
+ def __iadd__(self, other):
86
+ self.extend(other)
87
+ return self
88
+
89
+ def __contains__(self, obj):
90
+ return obj in list(self)
91
+
92
+ def __mul__(self, n):
93
+ return WeakList(list(self)*n)
94
+
95
+ def __imul__(self, n):
96
+ self._refs *= n
97
+ return self