class CoordPair(object): def __init__(self, fst, snd=None): if snd == None: fst, snd = fst self.fst, self.snd = fst,snd @property def pair(self): return self.fst, self.snd def __len__(self): return 2 def __iter__(self): return iter(self.pair) def __getitem__(self, idx): if idx == 0: return self.fst elif idx == 1: return self.snd else: raise KeyError("Only two elements in a coordpair") def transform(self, *transforms): '''Note: mul _then_ add''' f,s = self.pair for transform in transforms: x = transform.get('mul', (1,1)) if not hasattr(x, '__iter__'): x=(x,x) f1,f2 = x f *= f1 s *= f2 x = transform.get('add', (0,0)) if not hasattr(x, '__iter__'): x=(x,x) f1,f2 = x f += f1 s += f2 return f,s def __ne__(self, other): return not self.__eq__(other) def __rne__(self, other): return not self.__eq__(other) def __eq__(self, other): a,b = self c,d = other return a==c and b==d def __req__(self, other): return self == other def __add__(self, other): return self.__class__(self.transform({'add': other})) def __radd__(self, other): return self.__class__(self.transform({'add': other})) def __mul__(self, other): return self.__class__(self.transform({'mul': other})) def __rmul__(self, other): return self.__class__(self.transform({'mul': other})) def __sub__(self, other): a,b = other return self.__class__(self.transform({'add': (-a,-b)})) def __rsub__(self, other): a,b = other return self.__class__(self.transform({'add': (-a,-b)})) def __div__(self, other): return self.__class__(self.transform({'mul': 1.0/other})) def __rdiv__(self, other): return self.__class__(self.transform({'mul': 1.0/other})) def __repr__(self): return '%s(%s,%s)' % (self.__class__.__name__, self.fst, self.snd)