1from __future__ import annotations 
    2 
    3from collections import deque 
    4 
    5from .base import Clipboard, ClipboardData 
    6 
    7__all__ = [ 
    8    "InMemoryClipboard", 
    9] 
    10 
    11 
    12class InMemoryClipboard(Clipboard): 
    13    """ 
    14    Default clipboard implementation. 
    15    Just keep the data in memory. 
    16 
    17    This implements a kill-ring, for Emacs mode. 
    18    """ 
    19 
    20    def __init__(self, data: ClipboardData | None = None, max_size: int = 60) -> None: 
    21        assert max_size >= 1 
    22 
    23        self.max_size = max_size 
    24        self._ring: deque[ClipboardData] = deque() 
    25 
    26        if data is not None: 
    27            self.set_data(data) 
    28 
    29    def set_data(self, data: ClipboardData) -> None: 
    30        self._ring.appendleft(data) 
    31 
    32        while len(self._ring) > self.max_size: 
    33            self._ring.pop() 
    34 
    35    def get_data(self) -> ClipboardData: 
    36        if self._ring: 
    37            return self._ring[0] 
    38        else: 
    39            return ClipboardData() 
    40 
    41    def rotate(self) -> None: 
    42        if self._ring: 
    43            # Add the very first item at the end. 
    44            self._ring.append(self._ring.popleft())