Comparing version
@@ -24,4 +24,3 @@ /** | ||
declare class ReadonlyRemitter<TConfig = any> { | ||
#private; | ||
interface EventReceiver<TConfig = any> { | ||
/** | ||
@@ -32,10 +31,2 @@ * An event name to listen to all events or to remit on any event listener. | ||
/** | ||
* Emit an event to `eventName` listeners. | ||
*/ | ||
protected emit<TEventName extends RemitterDatalessEventName<TConfig>>(eventName: TEventName): void; | ||
/** | ||
* Emit an event with payload to `eventName` listeners. | ||
*/ | ||
protected emit<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, eventData: TConfig[TEventName]): void; | ||
/** | ||
* Add an `ANY_EVENT_NAME` listener to receive all events. | ||
@@ -49,2 +40,6 @@ */ | ||
/** | ||
* Add an `ANY_EVENT_NAME` listener to receive all events. | ||
*/ | ||
onAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
/** | ||
* Add a one-time listener to `ANY_EVENT_NAME` to receive all events.. | ||
@@ -58,7 +53,24 @@ */ | ||
/** | ||
* Add a one-time listener to `ANY_EVENT_NAME` to receive all events.. | ||
*/ | ||
onceAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
/** | ||
* Remove a listener from the eventName. | ||
*/ | ||
off<TEventName extends AllRemitterEventNames<TConfig>>(eventName: TEventName, listener: Fn): boolean; | ||
/** | ||
* Remove a listener from `ANY_EVENT_NAME`. | ||
*/ | ||
offAny(listener: AnyRemitterListener<TConfig>): boolean; | ||
/** | ||
* Remove all listeners. | ||
*/ | ||
clear<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): void; | ||
/** | ||
* If the eventName has any listener. | ||
* @param eventName Optional eventName to check. | ||
* @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. | ||
*/ | ||
has<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): boolean; | ||
/** | ||
* @deprecated Use `has` instead. | ||
@@ -71,8 +83,16 @@ * Returns the number of listeners for the eventName. | ||
/** | ||
* If the eventName has any listener. | ||
* @param eventName Optional eventName to check. | ||
* @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. | ||
* Remove all listeners and all remit listeners. | ||
*/ | ||
has<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): boolean; | ||
dispose(): void; | ||
} | ||
interface Remitter<TConfig = any> extends EventReceiver<TConfig> { | ||
/** | ||
* Emit an event to `eventName` listeners. | ||
*/ | ||
emit<TEventName extends RemitterDatalessEventName<TConfig>>(eventName: TEventName): void; | ||
/** | ||
* Emit an event with payload to `eventName` listeners. | ||
*/ | ||
emit<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, eventData: TConfig[TEventName]): void; | ||
/** | ||
* Start a side effect when the eventName has a first listener. | ||
@@ -87,17 +107,34 @@ * Dispose the side effect when the eventName has no listeners. | ||
*/ | ||
protected remit<TEventName extends AllRemitterEventNames<TConfig>>(eventName: TEventName, start: (remitter: Remitter<TConfig>) => RemitterDisposer): RemitterDisposer; | ||
remit<TEventName extends AllRemitterEventNames<TConfig>>(eventName: TEventName, start: (remitter: Remitter<TConfig>) => RemitterDisposer): RemitterDisposer; | ||
} | ||
declare class Remitter<TConfig = any> implements Remitter<TConfig> { | ||
#private; | ||
readonly ANY_EVENT: ANY_EVENT; | ||
emit<TEventName extends RemitterDatalessEventName<TConfig>>(eventName: TEventName): void; | ||
emit<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, eventData: TConfig[TEventName]): void; | ||
on(eventName: typeof ANY_EVENT, listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
on<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, listener: RemitterListener<TConfig, TEventName>): RemitterDisposer; | ||
onAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
once(eventName: typeof ANY_EVENT, listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
once<TEventName extends RemitterEventNames<TConfig>>(eventName: TEventName, listener: RemitterListener<TConfig, TEventName>): RemitterDisposer; | ||
onceAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
off<TEventName extends AllRemitterEventNames<TConfig>>(eventName: TEventName, listener: Fn): boolean; | ||
offAny(listener: AnyRemitterListener<TConfig>): boolean; | ||
clear<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): void; | ||
has<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): boolean; | ||
/** | ||
* Dispose all listeners. | ||
* @deprecated Use `has` instead. | ||
*/ | ||
count<TEventName extends AllRemitterEventNames<TConfig>>(eventName?: TEventName): number; | ||
dispose(): void; | ||
} | ||
declare class Remitter<TConfig = any> extends ReadonlyRemitter<TConfig> { | ||
constructor(); | ||
emit: { | ||
<TEventName extends RemitterDatalessEventName<TConfig>>(eventName: TEventName): void; | ||
<TEventName_1 extends keyof TConfig>(eventName: TEventName_1, eventData: TConfig[TEventName_1]): void; | ||
}; | ||
remit: <TEventName extends AllRemitterEventNames<TConfig>>(eventName: TEventName, start: (remitter: Remitter<TConfig>) => RemitterDisposer) => RemitterDisposer; | ||
} | ||
/** | ||
* @deprecated Use `EventReceiver` instead. | ||
*/ | ||
type ReadonlyRemitter<TConfig = any> = EventReceiver<TConfig>; | ||
/** | ||
* @deprecated Use `Remitter` instead. | ||
*/ | ||
declare const ReadonlyRemitter: typeof Remitter; | ||
export { ANY_EVENT, AllRemitterEventNames, AnyEventData, AnyRemitterListener, ReadonlyRemitter, Remitter, RemitterConfig, RemitterDatalessEventName, RemitterDisposer, RemitterEventNames, RemitterListener }; | ||
export { ANY_EVENT, AllRemitterEventNames, AnyEventData, AnyRemitterListener, EventReceiver, ReadonlyRemitter, Remitter, RemitterConfig, RemitterDatalessEventName, RemitterDisposer, RemitterEventNames, RemitterListener }; |
@@ -86,6 +86,3 @@ 'use strict'; | ||
// src/remitter.ts | ||
var ReadonlyRemitter = class { | ||
/** | ||
* An event name to listen to all events or to remit on any event listener. | ||
*/ | ||
var Remitter = class { | ||
ANY_EVENT = ANY_EVENT; | ||
@@ -126,2 +123,5 @@ #listeners = /* @__PURE__ */ new Map(); | ||
} | ||
onAny(listener) { | ||
return this.on(ANY_EVENT, listener); | ||
} | ||
once(eventName, listener) { | ||
@@ -137,5 +137,5 @@ const off = abortable(() => this.off(eventName, onceListener)); | ||
} | ||
/** | ||
* Remove a listener from the eventName. | ||
*/ | ||
onceAny(listener) { | ||
return this.once(ANY_EVENT, listener); | ||
} | ||
off(eventName, listener) { | ||
@@ -159,2 +159,5 @@ const listeners = this.#listeners.get(eventName); | ||
} | ||
offAny(listener) { | ||
return this.off(ANY_EVENT, listener); | ||
} | ||
clear(eventName) { | ||
@@ -170,7 +173,16 @@ if (eventName) { | ||
} | ||
has(eventName) { | ||
if (eventName) { | ||
return this.#listeners.get(eventName)?.size > 0; | ||
} else { | ||
for (const listeners of this.#listeners.values()) { | ||
if (listeners.size > 0) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
} | ||
/** | ||
* @deprecated Use `has` instead. | ||
* Returns the number of listeners for the eventName. | ||
* @param eventName Optional eventName to check. | ||
* @returns The number of listeners for the eventName. If no eventName is provided, returns the total count of all listeners. | ||
*/ | ||
@@ -188,29 +200,2 @@ count(eventName) { | ||
} | ||
/** | ||
* If the eventName has any listener. | ||
* @param eventName Optional eventName to check. | ||
* @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. | ||
*/ | ||
has(eventName) { | ||
if (eventName) { | ||
return this.#listeners.get(eventName)?.size > 0; | ||
} else { | ||
for (const listeners of this.#listeners.values()) { | ||
if (listeners.size > 0) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
} | ||
/** | ||
* Start a side effect when the eventName has a first listener. | ||
* Dispose the side effect when the eventName has no listeners. | ||
* For example tap into other events. | ||
* | ||
* remit `ANY_EVENT` will be started when any event is listened. | ||
* | ||
* @param eventName | ||
* @param start A function that is called when listener count if `eventName` grows from 0 to 1. Returns a disposer when listener count if `eventName` drops from 1 to 0. | ||
*/ | ||
remit(eventName, start) { | ||
@@ -232,5 +217,2 @@ const relayListener = { | ||
} | ||
/** | ||
* Dispose all listeners. | ||
*/ | ||
dispose() { | ||
@@ -241,9 +223,3 @@ this.clear(); | ||
}; | ||
var Remitter = class extends ReadonlyRemitter { | ||
constructor() { | ||
super(); | ||
} | ||
emit = super.emit; | ||
remit = super.remit; | ||
}; | ||
var ReadonlyRemitter = Remitter; | ||
@@ -250,0 +226,0 @@ exports.ANY_EVENT = ANY_EVENT; |
{ | ||
"name": "remitter", | ||
"version": "0.3.4", | ||
"version": "0.3.5", | ||
"private": false, | ||
@@ -5,0 +5,0 @@ "description": "A TypeScript friendly event emitter with easy re-emitting events.", |
@@ -75,3 +75,3 @@ # remitter | ||
remitter.on(remitter.ANY_EVENT, ({ event, data }) => { | ||
remitter.onAny(({ event, data }) => { | ||
console.log(event, data); | ||
@@ -78,0 +78,0 @@ }); |
@@ -12,2 +12,2 @@ export type { | ||
export { ANY_EVENT } from "./constants"; | ||
export { Remitter, ReadonlyRemitter } from "./remitter"; | ||
export { Remitter, ReadonlyRemitter, type EventReceiver } from "./remitter"; |
import type { AllRemitterEventNames, RemitterDisposer } from "./interface"; | ||
import type { ReadonlyRemitter, Remitter } from "./remitter"; | ||
import type { Remitter } from "./remitter"; | ||
import { ANY_EVENT } from "./constants"; | ||
@@ -52,3 +52,3 @@ import { noop, tryCall } from "./utils"; | ||
listeners: Set<RelayListener>, | ||
remitter: ReadonlyRemitter | ||
remitter: Remitter | ||
) => { | ||
@@ -55,0 +55,0 @@ for (const listener of listeners) { |
@@ -22,6 +22,125 @@ import type { | ||
export class ReadonlyRemitter<TConfig = any> { | ||
export interface EventReceiver<TConfig = any> { | ||
/** | ||
* An event name to listen to all events or to remit on any event listener. | ||
*/ | ||
readonly ANY_EVENT: ANY_EVENT; | ||
/** | ||
* Add an `ANY_EVENT_NAME` listener to receive all events. | ||
*/ | ||
on( | ||
eventName: typeof ANY_EVENT, | ||
listener: AnyRemitterListener<TConfig> | ||
): RemitterDisposer; | ||
/** | ||
* Add a listener to the eventName. | ||
*/ | ||
on<TEventName extends RemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
listener: RemitterListener<TConfig, TEventName> | ||
): RemitterDisposer; | ||
/** | ||
* Add an `ANY_EVENT_NAME` listener to receive all events. | ||
*/ | ||
onAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
/** | ||
* Add a one-time listener to `ANY_EVENT_NAME` to receive all events.. | ||
*/ | ||
once( | ||
eventName: typeof ANY_EVENT, | ||
listener: AnyRemitterListener<TConfig> | ||
): RemitterDisposer; | ||
/** | ||
* Add a one-time listener to the eventName. | ||
*/ | ||
once<TEventName extends RemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
listener: RemitterListener<TConfig, TEventName> | ||
): RemitterDisposer; | ||
/** | ||
* Add a one-time listener to `ANY_EVENT_NAME` to receive all events.. | ||
*/ | ||
onceAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer; | ||
/** | ||
* Remove a listener from the eventName. | ||
*/ | ||
off<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
listener: Fn | ||
): boolean; | ||
/** | ||
* Remove a listener from `ANY_EVENT_NAME`. | ||
*/ | ||
offAny(listener: AnyRemitterListener<TConfig>): boolean; | ||
/** | ||
* Remove all listeners. | ||
*/ | ||
clear<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName?: TEventName | ||
): void; | ||
/** | ||
* If the eventName has any listener. | ||
* @param eventName Optional eventName to check. | ||
* @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. | ||
*/ | ||
has<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName?: TEventName | ||
): boolean; | ||
/** | ||
* @deprecated Use `has` instead. | ||
* Returns the number of listeners for the eventName. | ||
* @param eventName Optional eventName to check. | ||
* @returns The number of listeners for the eventName. If no eventName is provided, returns the total count of all listeners. | ||
*/ | ||
count<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName?: TEventName | ||
): number; | ||
/** | ||
* Remove all listeners and all remit listeners. | ||
*/ | ||
dispose(): void; | ||
} | ||
export interface Remitter<TConfig = any> extends EventReceiver<TConfig> { | ||
/** | ||
* Emit an event to `eventName` listeners. | ||
*/ | ||
emit<TEventName extends RemitterDatalessEventName<TConfig>>( | ||
eventName: TEventName | ||
): void; | ||
/** | ||
* Emit an event with payload to `eventName` listeners. | ||
*/ | ||
emit<TEventName extends RemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
eventData: TConfig[TEventName] | ||
): void; | ||
/** | ||
* Start a side effect when the eventName has a first listener. | ||
* Dispose the side effect when the eventName has no listeners. | ||
* For example tap into other events. | ||
* | ||
* remit `ANY_EVENT` will be started when any event is listened. | ||
* | ||
* @param eventName | ||
* @param start A function that is called when listener count if `eventName` grows from 0 to 1. Returns a disposer when listener count if `eventName` drops from 1 to 0. | ||
*/ | ||
remit<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
start: (remitter: Remitter<TConfig>) => RemitterDisposer | ||
): RemitterDisposer; | ||
} | ||
export class Remitter<TConfig = any> implements Remitter<TConfig> { | ||
public readonly ANY_EVENT: ANY_EVENT = ANY_EVENT; | ||
@@ -38,16 +157,10 @@ | ||
/** | ||
* Emit an event to `eventName` listeners. | ||
*/ | ||
protected emit<TEventName extends RemitterDatalessEventName<TConfig>>( | ||
public emit<TEventName extends RemitterDatalessEventName<TConfig>>( | ||
eventName: TEventName | ||
): void; | ||
/** | ||
* Emit an event with payload to `eventName` listeners. | ||
*/ | ||
protected emit<TEventName extends RemitterEventNames<TConfig>>( | ||
public emit<TEventName extends RemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
eventData: TConfig[TEventName] | ||
): void; | ||
protected emit<TEventName extends RemitterEventNames<TConfig>>( | ||
public emit<TEventName extends RemitterEventNames<TConfig>>( | ||
event: TEventName, | ||
@@ -63,3 +176,3 @@ data?: TConfig[TEventName] | ||
if (event !== ANY_EVENT && this.has(ANY_EVENT)) { | ||
(this as ReadonlyRemitter<RemitterConfig<TConfig>>).emit(ANY_EVENT, { | ||
(this as Remitter<RemitterConfig<TConfig>>).emit(ANY_EVENT, { | ||
event, | ||
@@ -71,5 +184,2 @@ data, | ||
/** | ||
* Add an `ANY_EVENT_NAME` listener to receive all events. | ||
*/ | ||
public on( | ||
@@ -79,5 +189,2 @@ eventName: typeof ANY_EVENT, | ||
): RemitterDisposer; | ||
/** | ||
* Add a listener to the eventName. | ||
*/ | ||
public on<TEventName extends RemitterEventNames<TConfig>>( | ||
@@ -110,5 +217,6 @@ eventName: TEventName, | ||
/** | ||
* Add a one-time listener to `ANY_EVENT_NAME` to receive all events.. | ||
*/ | ||
public onAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer { | ||
return this.on(ANY_EVENT, listener); | ||
} | ||
public once( | ||
@@ -118,5 +226,2 @@ eventName: typeof ANY_EVENT, | ||
): RemitterDisposer; | ||
/** | ||
* Add a one-time listener to the eventName. | ||
*/ | ||
public once<TEventName extends RemitterEventNames<TConfig>>( | ||
@@ -142,5 +247,6 @@ eventName: TEventName, | ||
/** | ||
* Remove a listener from the eventName. | ||
*/ | ||
public onceAny(listener: AnyRemitterListener<TConfig>): RemitterDisposer { | ||
return this.once(ANY_EVENT, listener); | ||
} | ||
public off<TEventName extends AllRemitterEventNames<TConfig>>( | ||
@@ -168,2 +274,6 @@ eventName: TEventName, | ||
public offAny(listener: AnyRemitterListener<TConfig>): boolean { | ||
return this.off(ANY_EVENT, listener); | ||
} | ||
public clear<TEventName extends AllRemitterEventNames<TConfig>>( | ||
@@ -182,19 +292,14 @@ eventName?: TEventName | ||
/** | ||
* @deprecated Use `has` instead. | ||
* Returns the number of listeners for the eventName. | ||
* @param eventName Optional eventName to check. | ||
* @returns The number of listeners for the eventName. If no eventName is provided, returns the total count of all listeners. | ||
*/ | ||
public count<TEventName extends AllRemitterEventNames<TConfig>>( | ||
public has<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName?: TEventName | ||
): number { | ||
): boolean { | ||
if (eventName) { | ||
return this.#listeners.get(eventName)?.size || 0; | ||
return (this.#listeners.get(eventName)?.size as number) > 0; | ||
} else { | ||
let count = 0; | ||
for (const listeners of this.#listeners.values()) { | ||
count += listeners.size; | ||
if (listeners.size > 0) { | ||
return true; | ||
} | ||
} | ||
return count; | ||
return false; | ||
} | ||
@@ -204,32 +309,19 @@ } | ||
/** | ||
* If the eventName has any listener. | ||
* @param eventName Optional eventName to check. | ||
* @returns `true` if the eventName has any listener, `false` otherwise. If no eventName is provided, returns `true` if the Remitter has any listener. | ||
* @deprecated Use `has` instead. | ||
*/ | ||
public has<TEventName extends AllRemitterEventNames<TConfig>>( | ||
public count<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName?: TEventName | ||
): boolean { | ||
): number { | ||
if (eventName) { | ||
return (this.#listeners.get(eventName)?.size as number) > 0; | ||
return this.#listeners.get(eventName)?.size || 0; | ||
} else { | ||
let count = 0; | ||
for (const listeners of this.#listeners.values()) { | ||
if (listeners.size > 0) { | ||
return true; | ||
} | ||
count += listeners.size; | ||
} | ||
return false; | ||
return count; | ||
} | ||
} | ||
/** | ||
* Start a side effect when the eventName has a first listener. | ||
* Dispose the side effect when the eventName has no listeners. | ||
* For example tap into other events. | ||
* | ||
* remit `ANY_EVENT` will be started when any event is listened. | ||
* | ||
* @param eventName | ||
* @param start A function that is called when listener count if `eventName` grows from 0 to 1. Returns a disposer when listener count if `eventName` drops from 1 to 0. | ||
*/ | ||
protected remit<TEventName extends AllRemitterEventNames<TConfig>>( | ||
public remit<TEventName extends AllRemitterEventNames<TConfig>>( | ||
eventName: TEventName, | ||
@@ -258,5 +350,2 @@ start: (remitter: Remitter<TConfig>) => RemitterDisposer | ||
/** | ||
* Dispose all listeners. | ||
*/ | ||
public dispose(): void { | ||
@@ -268,8 +357,9 @@ this.clear(); | ||
export class Remitter<TConfig = any> extends ReadonlyRemitter<TConfig> { | ||
public constructor() { | ||
super(); | ||
} | ||
public override emit = super.emit; | ||
public override remit = super.remit; | ||
} | ||
/** | ||
* @deprecated Use `EventReceiver` instead. | ||
*/ | ||
export type ReadonlyRemitter<TConfig = any> = EventReceiver<TConfig>; | ||
/** | ||
* @deprecated Use `Remitter` instead. | ||
*/ | ||
export const ReadonlyRemitter = Remitter; |
Sorry, the diff of this file is not supported yet
37198
5.93%1006
6.68%