Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 19x 191x 19x 303x 19x 375x 12x 19x 122x | import { invokeEach } from "./utils";
export type Listener<T = any> = (data: T) => void;
/**
* Unsubscribes the bound listener.
* @returns Returns true if the listener existed and has been removed,
* or false if the listener does not exist.
*/
export type RemoveListener = () => boolean;
export interface EventObject<T = any> {
/** @internal */
multi_?: Set<Listener<T>> | null;
/** @internal */
single_?: Listener<T> | null;
}
export const send = <T = any>(eventObject: EventObject<T>, data: T): void =>
eventObject.multi_ ? invokeEach(eventObject.multi_, data) : eventObject.single_?.(data);
export const size = (eventObject: EventObject): number =>
eventObject.multi_ ? eventObject.multi_.size : eventObject.single_ ? 1 : 0;
export const on = (eventObject: EventObject, listener: Listener): RemoveListener => (
eventObject.multi_ || eventObject.single_
? (eventObject.single_ = void (eventObject.multi_ ??= new Set<Listener>().add(eventObject.single_!)).add(listener))
: (eventObject.single_ = listener),
() => off(eventObject, listener)
);
export const off = (eventObject: EventObject, listener: Listener): boolean =>
eventObject.multi_
? eventObject.multi_.delete(listener)
: eventObject.single_ === listener && !(eventObject.single_ = null);
|