class Queue: __slots__ = ('_events', '_amounts') def __init__(self, events=None): if events is None: events = [] self._events = events self._amounts = {} if isinstance(events, list): for event in events: if isinstance(event, dict) and 'id' in event and 'cents' in event: request_id = event['id'] cents = event['cents'] if isinstance(cents, int) and not isinstance(cents, bool) and request_id not in self._amounts: self._amounts[request_id] = cents @property def events(self): return self._events def enqueue(self, request_id, cents): if isinstance(cents, bool) or not isinstance(cents, int): raise TypeError('cents must be an integer') if cents <= 0: raise ValueError('cents must be positive') if request_id in self._amounts: existing = self._amounts[request_id] if existing == cents: return 'duplicate' raise ValueError('request id already used with a different amount') event = {'id': request_id, 'cents': cents} self._events.append(event) self._amounts[request_id] = cents return 'queued'