Canopy開発日誌-3月-まとめ
2月までにmonorepoの形はできていた。3月は、その中身を外に出し、編集を一本化し、UIを載せる——三つの動きが重なった月だ。日々の記録は通常版の日誌、英語版はHighlights (English)。
ソースコードを構造(IR)として編集する MoonBit 製エディタ。概要はCanopyとは。
1. parserがloomになる
12月からCanopy内にあったparserを、dowdiness/loomとして独立リポジトリへ切り出した。CanopyはこのタイミングでloomのAPIへ移行している。
複数のライブラリへ分岐していく最初の一歩だ。のちのJSON・Markdown・JSX統合は、すべてこの分離の上に載る。
2. SyncEditorが編集を統一
ParsedEditorをSyncEditorへ置き換え、編集・undo/redo・同期・presenceを一つのeditor abstractionにまとめた。
それまでバラバラだった操作が一箇所に寄った。以後のLambda名前解決からJSON/block editorまで、ここに積み上がっていく。
3. RabbitaとIdeal editorが急成長
Rabbitaベースのprojectional editorに、ようやく本物のUI基盤ができた。性能問題を潰し、mobile layout、design tokens、tree pane navigationを入れた。
16の構造編集アクションも実装された。テキストを置換するのではなく、プログラムの構造を直接動かす操作が、初めて揃った月だ。
4. CRDTの性能改善
FugueTree/traverse_treeをiterative化し、order-treeを導入した。event-graph-walkerのtwo-count retreat最適化で、走査は17.7倍速くなった。
地味に見えるが、構造編集は「気づかないほど速い」状態でないと成立しない。遅さが表面化してから直すのは、もう手遅れに近い。
5. WebSocketでのリアルタイム協調編集
transport layer、relay server、sync recovery protocol、ephemeral store v2を実装した。1月の協調編集デモから一歩進み、複数人が同じ文書をライブ編集するインフラが本格的に整った。
6. framework抽出と新エディタ
ProjNode[T]のgeneric化、TreeNode/Renderable traitの導入で、Canopy固有のコードからframework/coreパッケージの切り出しが始まった。
その土台の上に、block editor、JSON editor、AST Zipper、Container Phase 1が立ち上がった。Lambdaだけのエディタではなく、複数の編集形態を支える骨格が見え始める。
独立ライブラリとしてのloom、汎用projection framework、Lambdaにとどまらないblockベースのエディタ群。4月のEditorProtocol統一も、この月の延長線上にある。
- GitHub: dowdiness/canopy · dowdiness/loom · mooncakes.io/user/dowdiness
- 全文: 3月の日誌