プラグイン方式の整理

パフォーマーの起動〈invocation〉
  1. 関数呼び出し(プロファイルが必要)
  2. オブジェクトのメソッド呼び出し(メソッド名+プロファイルが必要)
パフォーマーの失敗結果〈failure result〉
  1. エラー戻り値(規約が必要)
  2. 例外(モラルが必要; Error型データを投げる)
  3. コールバックに失敗理由〈reason〉値渡し
  4. プロミス拒否〈reject〉
パフォーマーの成功結果〈success result〉
  1. 戻り値
  2. コールバックに結果値〈value〉渡し
  3. プロミス解決〈resolve〉
アタッチャーの方式
  1. 関数ファクトリ関数、呼び出しの戻り値がパフォーマー関数
  2. オブジェクトコンストラクタ関数、new呼び出しの戻り値がパフォーマーオブジェクト
パフォーマー間の連携
  1. 仮想ファイルからの読み込み、文字列が得られる。
  2. ツリーの受け渡し、直接書き換え
  3. 仮想ファイルへの書き込み。
文書概念
  1. ソースとしては
    1. 文字列のみ(メタデータなし)
    2. 文字列+VFile(メタデータ担当)
    3. VFileのみ(.value で文字列にアクセス可能)
  2. 中間では
    1. ツリーのみ(メタデータなし)
    2. ツリー+VFile(メタデータ担当)

次のデータ構造を考えたほうがいいだろう。

type Document<Tree> = [Tree, VFile];

関数が2引数を持つときは、

function foo(...args:Document<Tree>) : SomeType {
  // ...
}