/** * ハンドラの関数の型。 * * この関数がtruthyな値を返した場合、ハンドラ登録は解除される。 */ export type HandlerFunction = HandlerSyncFunction | HandlerAsyncFunction; export type HandlerSyncFunction = (arg: T) => void | boolean; export type HandlerAsyncFunction = (arg: T) => Promise; export type HandlerFilterFunction = (handler: TriggerHandler) => boolean; /** * Triggerのハンドラ。 */ export interface TriggerHandler { /** * ハンドラの関数。 */ func: HandlerFunction; /** * ハンドラのオーナー。 * `func` 呼び出しの際に `this` として利用される値。 */ owner: unknown; /** * 呼び出し後、 `remove()` されるべきである時またその時のみ、真。 */ once: boolean; /** * ハンドラの名前。 */ name: string | null | undefined; /** * ハンドラを発火する条件。 */ filter: HandlerFilterFunction | undefined; } /** * Triggerを追加する際に指定するパラメータ。 */ export interface TriggerAddParameters { /** * ハンドラの関数。 */ func: HandlerFunction; /** * ハンドラのオーナー。 * `func` 呼び出しの際に `this` として利用される値。 */ owner?: unknown; /** * ハンドラの名前。 */ name?: string; /** * ハンドラのリストの挿入先インデックス。 * 通常、指定する必要はない。省略した場合、ハンドラは末尾に追加される。 */ index?: number; /** * ハンドラを発火する条件。 */ filter?: HandlerFilterFunction; } /** * Triggerを削除する際に指定するパラメータ。 */ export interface TriggerRemoveConditions { /** * ハンドラの関数。 * * 登録時 `func` に指定された値がこの値と同値でないハンドラは削除されない。 * 省略された場合、 `remove()` では `undefined` とみなされる。 * 省略された場合、 `removeAll()` ではこの値に関係なく他の条件にマッチする限り削除される。 */ func?: HandlerFunction; /** * ハンドラのオーナー。 * * 登録時 `owner` に指定された値がこの値と同値でないハンドラは削除されない。 * 省略された場合、 `remove()` では `undefined` とみなされる。 * 省略された場合、 `removeAll()` ではこの値に関係なく他の条件にマッチする限り削除される。 */ owner?: unknown; /** * ハンドラの名前。 * * 登録時 `name` に指定された値がこの値と同値でないハンドラは削除されない。 * 省略された場合、 `remove()` では `undefined` とみなされる。 * 省略された場合、 `removeAll()` ではこの値に関係なく他の条件にマッチする限り削除される。 */ name?: string; /** * ハンドラを発火する条件。 * * 登録時 `filter` に指定された値がこの値と同値でないハンドラは削除されない。 * 省略された場合、 `remove()` では `undefined` とみなされる。 * 省略された場合、 `removeAll()` ではこの値に関係なく他の条件にマッチする限り削除される。 */ filter?: HandlerFilterFunction; } /** * Triggerの検索条件を指定するパラメータ。 */ export interface TriggerSearchConditions { func?: HandlerFunction; owner?: unknown; name?: string | null; filter?: HandlerFilterFunction; } /** * イベント通知機構。 */ export interface TriggerLike { /** * 登録されているハンドラの数。 */ length: number; /** * このTriggerにハンドラを追加する。 * @param func ハンドラの関数 * @param owner ハンドラのオーナー。 `func` を呼び出す時に `this` として用いられる値 */ add(func: HandlerFunction, owner?: unknown): void; /** * このTriggerにハンドラを追加する。 * @param params 登録するハンドラの情報 */ add(params: TriggerAddParameters): void; /** * このTriggerにハンドラを追加する。 * 本メソッドにより追加されたハンドラは実行後に破棄される。 * @param func ハンドラの関数 * @param owner ハンドラのオーナー。 `func` を呼び出す時に `this` として用いられる値 */ addOnce(func: HandlerFunction, owner?: unknown): void; /** * このTriggerにハンドラを追加する。 * 本メソッドにより追加されたハンドラは実行後に破棄される。 * @param params 登録するハンドラの情報 */ addOnce(params: TriggerAddParameters): void; /** * このTriggerにハンドラを追加する。 * @deprecated 互換性のために残されている。代わりに `add()` を利用すべきである。 */ handle(owner: any, func?: HandlerFunction, name?: string): void; /** * このTriggerを発火する。 * * 登録された全ハンドラの関数を、引数 `arg` を与えて呼び出す。 * 呼び出し後、次のいずれかの条件を満たす全ハンドラの登録は解除される。 * * ハンドラが `addOnce()` で登録されていた場合 * * ハンドラが `add()` で登録される際に `once: true` オプションが与えられていた場合 * * 関数がtruthyな値を返した場合 * * @param arg ハンドラに与えられる引数 */ fire(arg?: T): void; /** * 指定した条件に一致したハンドラが登録されているかを返す。 * 指定されなかった条件は、条件として無視される(登録時の値に関わらず一致するとみなされる)。 * * @param func 条件として用いるハンドラの関数 * @param owner 条件として用いるハンドラのオーナー */ contains(func: HandlerFunction | null, owner?: unknown): boolean; /** * 指定した条件に一致したハンドラが登録されているかを返す。 * 指定されなかった条件は、条件として無視される(登録時の値に関わらず一致するとみなされる)。 * * @param params 検索の条件 */ contains(params: TriggerSearchConditions): boolean; /** * 関数が `func` であり、かつオーナーが `owner` であるハンドラを削除する。 * 同じ組み合わせで複数登録されている場合、一つだけ削除する。 * * @param func 削除条件として用いるハンドラの関数 * @param owner 削除条件として用いるハンドラのオーナー。省略した場合、 `undefined` */ remove(func: HandlerFunction, owner?: unknown): void; /** * 指定した条件に完全一致するハンドラを削除する。 * 同じ組み合わせで複数登録されている場合、一つだけ削除する。 * * @param params 削除するハンドラの条件 */ remove(params: TriggerRemoveConditions): void; /** * 指定した条件に部分一致するハンドラを削除する。 * * 本メソッドは引数に与えた条件に一致したハンドラを全て削除する。 * 引数の条件を一部省略した場合、その値の内容が登録時と異なっていても対象のハンドラは削除される。 * 引数に与えた条件と完全に一致したハンドラのみを削除したい場合は `this.remove()` を用いる。 * 引数を省略した場合は全てのハンドラを削除する。 * * @param params 削除するハンドラの条件 */ removeAll(params?: TriggerRemoveConditions): void; /** * このTriggerを破棄する。 */ destroy(): void; /** * このTriggerが破棄されているかを返す。 */ destroyed(): boolean; }