Skip to content

akashic-games/trigger

Repository files navigation

Trigger

TypeScript向けに書かれたイベント通知機構です。 Node.jsの EventEmitter に相当する機能を提供しますが、TypeScript上の型定義を明確かつ簡潔にするため次の制限を加えています。

  • 名前(イベント名)を持たない (各通知ごとに個別の Trigger インスタンスを利用する)
  • 引数は高々一つ

インストール

Node.jsが必要です。次のコマンドでインストールできます。

npm install @akashic/trigger

利用方法

import するとclass Trigger, ChainTrigger が利用できます。

以下は Trigger の単純な使用例です。 APIの詳細な仕様は Trigger.ts, ChainTrigger.ts のコメントをご覧ください。

import { Trigger } from "@akashic/trigger";

// 引数の型 (ここでは string) を指定してインスタンス生成
const t = new Trigger<string>();

// ハンドラを追加
t.add((s: string) => {
    console.log("fired:", s);
});

// 第二引数でthisを指定して登録することも可能
t.add(someObject.method, someObject);

// オブジェクト引数を使うと全てのオプションが制御可能
t.add({
    func: someObject.method,
    owner: someObject,
    name: "name-as-you-like",  // ハンドラ識別用の名前
    index: 0                   // 挿入先を指定
});

// 一回実行したあと登録解除されるハンドラを追加
t.addOnce((s: string) => {
    // do something
});

// Promise を返すハンドラを追加
t.addOnce(async (s: string) => {
    // do something
});

// 全登録ハンドラを起動
t.fire("some-string-value");

// 条件にマッチするハンドラをすべて削除 (ここでは `owner` が `someObject` で登録されたものすべて)
t.removeAll({ owner: someObject });

// 登録ハンドラをすべて削除
t.removeAll();

併せて、 Trigger, ChainTrigger の公開APIと同じシグネチャを持つinterface TriggerLike, ChainTriggerLike も公開しています。 公開インターフェースなどにおいて、クラスへの依存を避け duck-typing を可能にしたいケースでは、 Trigger などをこれにキャストしてご利用ください。

import { Trigger, TriggerLike } from "@akashic/trigger";

export class Foo {
    onDestroyed: TriggerLike<void>;
    constructor() {
        this.onDestroyed = new Trigger<void>();
    }

    // `trigger` は直接 `Trigger` やその派生クラスでなくても、同じシグネチャを持つものでありさえすればよい
    someMethod(trigger: TriggerLike<number>): void {
        // ...
        trigger.fire(someValue);
    }
}

ライセンス

本リポジトリは MIT License の元で公開されています。 詳しくは LICENSE をご覧ください。

ただし、画像ファイルおよび音声ファイルは CC BY 2.1 JP の元で公開されています。