class SetMixin(object):
"""
Mix-in for sets. You must define __iter__, add, remove
"""
def __len__(self):
length = 0
for item in self:
length += 1
return length
def __contains__(self, item):
for has_item in self:
if item == has_item:
return True
return False
def issubset(self, other):
for item in other:
if item not in self:
return False
return True
__le__ = issubset
def issuperset(self, other):
for item in self:
if item not in other:
return False
return True
__ge__ = issuperset
def union(self, other):
return self | other
def __or__(self, other):
new = self.copy()
new |= other
return new
def intersection(self, other):
return self & other
def __and__(self, other):
new = self.copy()
new &= other
return new
def difference(self, other):
return self - other
def __sub__(self, other):
new = self.copy()
new -= other
return new
def symmetric_difference(self, other):
return self ^ other
def __xor__(self, other):
new = self.copy()
new ^= other
return new
def copy(self):
return set(self)
def update(self, other):
for item in other:
self.add(item)
def __ior__(self, other):
self.update(other)
return self
def intersection_update(self, other):
for item in self:
if item not in other:
self.remove(item)
def __iand__(self, other):
self.intersection_update(other)
return self
def difference_update(self, other):
for item in other:
if item in self:
self.remove(item)
def __isub__(self, other):
self.difference_update(other)
return self
def symmetric_difference_update(self, other):
for item in other:
if item in self:
self.remove(item)
else:
self.add(item)
def __ixor__(self, other):
self.symmetric_difference_update(other)
return self
def discard(self, item):
try:
self.remove(item)
except KeyError:
pass
def clear(self):
for item in list(self):
self.remove(item)