All files / src event.ts

100% Statements 14/14
100% Branches 16/16
100% Functions 4/4
100% Lines 14/14

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 362x                                   2x 62x   2x 59x   2x 111x 9x 102x 111x     2x 16x 7x 9x  
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);