Source code for abce.expiringgood
from past.builtins import cmp
from builtins import str
from builtins import zip
from builtins import range
from builtins import object
from collections import deque
from abce.notenoughgoods import NotEnoughGoods
from abce.trade import get_epsilon
epsilon = get_epsilon()
[docs]class ExpiringGood(object):
""" A good that expires after X rounds """
def __init__(self, duration):
self.duration = duration
self.time_structure = deque([0 for _ in range(duration)]) # old to new
def _advance_round(self):
del self.time_structure[0]
self.time_structure.append(0)
def __add__(self, other):
if isinstance(other, ExpiringGood):
self.time_structure = [
s + o for s, o in zip(self.time_structure, other.time_structure)]
else:
self.time_structure[-1] += other
return self
def __radd__(self, other):
return other + sum(self.time_structure)
def __sub__(self, other):
if isinstance(other, ExpiringGood):
other = float(other)
if sum(self.time_structure) < - epsilon:
raise NotEnoughGoods
for i in range(len(self.time_structure)):
if other >= self.time_structure[i]:
other -= self.time_structure[i]
self.time_structure[i] = 0
else:
self.time_structure[i] -= other
break
return self
def __rsub__(self, other):
return other - sum(self.time_structure)
def __mul__(self, other):
return sum(self.time_structure) * other
def __floordiv__(self, other):
return sum(self.time_structure) // other
def __div__(self, other):
return sum(self.time_structure) / other
def __mod__(self, other):
return sum(self.time_structure) % other
def __pow__(self, other):
return sum(self.time_structure) ** other
def __cmp__(self, other):
return cmp(sum(self.time_structure), other)
def __int__(self):
return int(sum(self.time_structure))
def __long__(self):
return int(sum(self.time_structure))
def __float__(self):
return float(sum(self.time_structure))
def __repr__(self):
return str(sum(self.time_structure))
def __get__(self, instance, owner=None):
return sum(self.time_structure)
def __abs__(self):
return abs(self.__float__())