Untitled

 avatar
unknown
plain_text
a year ago
2.0 kB
6
Indexable
class Memento:
    def __init__(self, state: str):
        self._state = state

    def get_state(self) -> str:
        return self._state

class TextEditor:
    def __init__(self):
        self._content = ""

    def add_text(self, text: str) -> None:
        self._content += text

    def delete_text(self, num_chars: int) -> None:
        self._content = self._content[:-num_chars]

    def save(self) -> Memento:
        return Memento(self._content)

    def restore(self, memento: Memento) -> None:
        self._content = memento.get_state()

    def get_text(self) -> str:
        return self._content

class Caretaker:
    def __init__(self, editor: TextEditor):
        self._editor = editor
        self._history = []
        self._redo_stack = []

    def save(self) -> None:
        self._history.append(self._editor.save())
        self._redo_stack.clear()  # Clear redo stack on new save

    def undo(self) -> None:
        if not self._history:
            return

        # Save current state for redo
        self._redo_stack.append(self._editor.save())

        # Restore last saved state
        memento = self._history.pop()
        self._editor.restore(memento)

    def redo(self) -> None:
        if not self._redo_stack:
            return

        # Save current state for undo
        self._history.append(self._editor.save())

        # Restore last undone state
        memento = self._redo_stack.pop()
        self._editor.restore(memento)

# Example Usage:
editor = TextEditor()
caretaker = Caretaker(editor)

editor.add_text("Hello")
caretaker.save()

editor.add_text(" World")
caretaker.save()

editor.delete_text(5)
caretaker.save()

print(editor.get_text())  # Output: "Hello"

caretaker.undo()
print(editor.get_text())  # Output: "Hello World"

caretaker.undo()
print(editor.get_text())  # Output: "Hello"

caretaker.redo()
print(editor.get_text())  # Output: "Hello World"
Editor is loading...
Leave a Comment