from collections import OrderedDict
 
class Ring(OrderedDict):
    """
    O(1) random access  ring buffer.
    Kind of like fixed size deque, but associative.
    """
 
    def __init__(self, sequence={}, pieces=20, *args, **kwargs):
        """
        @param sequence: sequence that will be passed to dict constructor.
        @param pieces: how much pieces will the buffer have.
        """
        self.pieces = max(pieces, 1)
        if len(sequence) > self.pieces:
            raise BufferError("Sequence is too long, increase pieces.")
        OrderedDict.__init__(self, sequence, *args, **kwargs)
 
    def __setitem__(self, key, item):
        """
        @param key: unique index of the piece(or overwrite something).
        @param item: item corresponding to the key.
        """
        OrderedDict.__setitem__(self, key, item)
        if len(self) > self.pieces:
            self.popitem(False)