Нужно реализовать класс TextHistory
, который хранит текст и историю его изменений.
Поддерживается три типа изменений — вставка текста (insert),
замена текста (replace) и удаление (delete).
Интерфейс:
h.text
— текущий текст, read onlyh.version
— текущая версия, read only. Начинается с 0 и только растет.h.insert(text, pos=pos)
— вставить текст с позиции pos (по умолчанию — конец строки). Кидает ValueError, если указана недопустимая позиция. Возвращает номер новой версии.h.replace(text, pos=pos)
— заменить текст с позиции pos (по умолчанию — конец строки). Кидает ValueError, если указана недопустимая позиция. Замена за пределами строки работает как вставка (т. е. текст дописывается). Возвращает номер новой версии.h.delete(pos, length)
— удаляетlength
символов начиная с позицииpos
. Возвращает номер новой версии.h.action(action)
— применяет действиеaction
(см. ниже). Возвращает номер новой версии. Версия растет не на 1, а устанавливается та, которая указана вaction
.h.get_actions(from_version=v1, to_version=v2)
— возвращаетlist
всех действий между двумя версиями.
Действия выражаются наследниками Action
: InsertAction
, ReplaceAction
и DeleteAction
.
Конструктор принимает позицию (pos
) и строку (text
) или позицию и длину (length
),
а так же стартовую и конечную версию.
Если версии указаны неверно, кидается ValueError.
Единственный публичный метод apply
принимает строку и возвращает модифицированную строку.
Метод get_actions
должен уметь применять к полученному списку оптимизации, которые
сокращают количество действий. Например, очевидно, что последовательные insert('x', pos=42)
и insert('y', pos=43)
можно заменить на insert('xy', pos=42)
.
Тестов на это нет, надо придумать минимум две любые оптимизации и реализовать.