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_text

Pourquoi 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'application

Corollaire 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.