Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from sortedcontainers import SortedListWithKey, SortedDict
- from operator import itemgetter
- class IndexedList(object):
- def __init__(self, *args, **kwargs):
- self.pk = 0
- self.indices = {}
- self.uniques = {'_pk': SortedDict()}
- self.keys = {'_pk': itemgetter(0)}
- def append(self, item):
- self.pk += 1
- item = (self.pk, item)
- for name in self.uniques:
- self.uniques[name][self.keys[name](item)] = item
- for name in self.indices:
- self.indices[name].add(item)
- def __iter__(self):
- return self.uniques['_pk'].values()
- def add_unique_index(self, name, key):
- key = lambda pair: key(pair[1])
- self.uniques[name] = SortedDict(zip(map(key, self), self))
- self.keys[name] = key
- def add_index(self, name, key):
- key = lambda pair: key(pair[1])
- items = zip(map(key, self), self)
- self.indices[name] = SortedListWithKey(items, key=itemgetter(0))
- def remove_unique(self, name, key):
- item = self.uniques[name][key]
- for name in self.uniques:
- del self.uniques[name][self.keys[name](item)]
- for name in self.indices:
- self.indices[name].remove(item)
- def remove_index(self, name, key):
- start = self.indices[name].bisect_left(key)
- end = self.indices[name].bisect_right(key)
- items = map(itemgetter(1), self.indices[name][start:end])
- for item in items:
- self.remove_unique('_pk', item[0])
- book = IndexedList()
- book.add_unique_index('order_id', lambda o: o.id)
- book.add_index('account_id', lambda o: o.account_id)
- book.add_index('price_time', lambda o: (o.price, o.time))
- def add_order(order):
- book.append(order)
- def del_order(order):
- book.remove_unique('order_id', order.id)
- def close_account(account_id):
- book.remove_index('account_id', account_id)
- def iter_matches(limit_price):
- for (price, time), order in book.indices['price_time']:
- if price > limit_price:
- break
- yield order
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement