Skip to content

Commit

Permalink
feat: add on (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
crimx authored Oct 16, 2024
1 parent 3c9d277 commit 498cbfc
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 17 deletions.
18 changes: 13 additions & 5 deletions src/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ export interface Listener<T = void> {

/** Generic type for `onSomeEvent`, which is a function itself. */
export interface IEvent<T = void> {
/** Adds listener, returns a dispose function. */
/**
* Adds a listener to the event.
* @param listener The callback to add.
* @returns A function to remove the listener.
*/
(listener: Listener<T>): () => void;
}

Expand All @@ -17,14 +21,18 @@ export interface AddEventListener<T = void> extends IEvent<T> {
*/
size(): number;
/**
* Removes listener.
* Adds a listener to the event.
* @param listener The callback to add.
* @returns A function to remove the listener.
*/
on(listener: Listener<T>): () => void;
/**
* Removes a listener from the event.
* @param listener The callback to remove. If omitted, all listeners are removed.
* @returns Whether the listener was found and removed.
*/
off(listener?: Listener<T>): boolean;
/**
* Removes all listeners.
*/

dispose(): void;

/**
Expand Down
7 changes: 2 additions & 5 deletions src/internal/variants/set-lazy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,10 @@ function dispose<T = void>(this: AddEventListenerImpl<T>): void {
*/
export const event = <T = void>(): AddEventListener<T> => {
function addEventListener(listener: Listener<T>): () => void {
on.call<AddEventListenerImpl<T>, [Listener<T>], void>(
addEventListener,
listener
);
return () => addEventListener.off(listener);
return addEventListener.on(listener);
}
addEventListener.size = size;
addEventListener.on = on;
addEventListener.off = off;
addEventListener.dispose = dispose;
addEventListener[SEND] = send;
Expand Down
12 changes: 10 additions & 2 deletions src/internal/variants/set-simple.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ function size<T>(this: AddEventListenerImpl<T>): number {
return this.listeners_.size;
}

function on<T>(
this: AddEventListenerImpl<T>,
listener: Listener<T>
): () => void {
this.listeners_.add(listener);
return () => this.off(listener);
}

function off<T>(
this: AddEventListenerImpl<T>,
listener?: Listener<T>
Expand Down Expand Up @@ -63,11 +71,11 @@ function dispose<T>(this: AddEventListenerImpl<T>): void {
*/
export const event = <T = void>(): AddEventListener<T> => {
function addEventListener(listener: Listener<T>): () => void {
addEventListener.listeners_.add(listener);
return () => addEventListener.off(listener);
return addEventListener.on(listener);
}
addEventListener.listeners_ = new Set<Listener<T>>();
addEventListener.size = size;
addEventListener.on = on;
addEventListener.off = off;
addEventListener.dispose = dispose;
addEventListener[SEND] = send;
Expand Down
7 changes: 2 additions & 5 deletions src/internal/variants/sparse-array-lazy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,11 @@ function dispose<T = void>(this: AddEventListenerImpl<T>): void {
*/
export const event = <T = void>(): AddEventListener<T> => {
function addEventListener(listener: Listener<T>): () => void {
on.call<AddEventListenerImpl<T>, [Listener<T>], void>(
addEventListener,
listener
);
return () => addEventListener.off(listener);
return addEventListener.on(listener);
}
addEventListener.size_ = 0;
addEventListener.size = size;
addEventListener.on = on;
addEventListener.off = off;
addEventListener.dispose = dispose;
addEventListener[SEND] = send;
Expand Down

0 comments on commit 498cbfc

Please sign in to comment.