Opérations et transactions
Il y a exactement sept opérations, et l'ensemble est fermé. Aucune fonctionnalité n'a le droit d'en ajouter une huitième : un tableau, des colonnes, un collage de dix blocs sont tous des transactionscomposées de ces sept-là.
insert_block | delete_block | move_block | update_block
insert_text | delete_text | format_textPourquoi c'est fermé
Chaque opération sait produire son inverse. L'annulation n'est donc pas une fonctionnalité écrite à part, c'est une conséquence — et il en va de même pour la persistance incrémentale, le journal des transactions, et la synchronisation collaborative prévue plus tard. Une huitième opération signifierait écrire son inverse, sa sérialisation et sa fusion : le coût réel d'un raccourci apparent.
editor.dispatch((tx) => {
tx.op({ type: 'update_block', id, patch: { props: { checked: true } } });
}, { origin: 'ui' });
editor.undo(); // l'inverse a été calculé au moment de l'applicationCorollaire concret : insérer un tableau 3×3 crée treize blocs en une seule transaction, donc une seule annulation. C'est ce que l'utilisateur attend, et personne n'a eu à l'implémenter.