evnty 1.1.37 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs +2 -2
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +27 -21
- package/build/index.js +2 -2
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +28 -27
package/build/index.cjs
CHANGED
|
@@ -94,7 +94,7 @@ class Event extends FunctionExt {
|
|
|
94
94
|
once(listener) {
|
|
95
95
|
const oneTimeListener = (...args)=>{
|
|
96
96
|
this.off(oneTimeListener);
|
|
97
|
-
listener(...args);
|
|
97
|
+
return listener(...args);
|
|
98
98
|
};
|
|
99
99
|
return this.on(oneTimeListener);
|
|
100
100
|
}
|
|
@@ -107,7 +107,7 @@ class Event extends FunctionExt {
|
|
|
107
107
|
filter(filter) {
|
|
108
108
|
const dispose = this.on(async (...args)=>{
|
|
109
109
|
if (filteredEvent.size > 0 && await filter(...args)) {
|
|
110
|
-
filteredEvent(...args);
|
|
110
|
+
return filteredEvent(...args);
|
|
111
111
|
}
|
|
112
112
|
});
|
|
113
113
|
const filteredEvent = new Event(dispose);
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface Unsubscribe {\n (): void;\n}\n\nexport interface Listener<T extends unknown[]> {\n (...args: T): void
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface Unsubscribe {\n (): void;\n}\n\nexport interface Listener<T extends unknown[], R> {\n (...args: T): MaybePromise<R | void>;\n}\n\nexport interface Dispose {\n (): void;\n}\n\nexport interface Filter<T extends unknown[]> {\n (...args: T): MaybePromise<boolean>;\n}\n\nexport interface Mapper<T extends unknown[], R> {\n (...args: T): R;\n}\n\nexport interface Reducer<T extends unknown[], R> {\n (value: R, ...args: T): R;\n}\n\nexport type Listeners<T extends unknown[], R> = Listener<T, R>[];\n\nclass FunctionExt extends Function {\n constructor(func: Function) {\n super();\n return Object.setPrototypeOf(func, new.target.prototype);\n }\n}\n\nexport interface Dismiss {\n (): Promise<void> | void;\n}\n\nexport class Dismiss extends FunctionExt {\n constructor(dismiss: Unsubscribe) {\n super(dismiss);\n }\n async after(process: () => MaybePromise<unknown>) {\n await process();\n this();\n }\n afterTimes(count: number) {\n return () => {\n if (!--count) {\n this();\n }\n };\n }\n}\n\nconst eventEmitter = async <A extends unknown[], R>(listeners: Listeners<A, R>, ...args: A) => {\n return Promise.all(listeners.map((listener) => listener(...args)));\n};\n\nexport interface Event<T extends unknown[], R> {\n (...args: T): Promise<R> | R;\n}\n\ntype UnpackParameters<T> = T extends Event<infer P, unknown> ? P : never;\ntype UnpackReturn<T> = T extends Event<unknown[], infer R> ? R : never;\ntype UnpackAllParameters<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackParameters<T[K]> }[number];\ntype UnpackAllReturn<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackReturn<T[K]> }[number];\n\nexport class Event<T extends unknown[], R = void> extends FunctionExt {\n static merge<Events extends Event<any[], any>[]>(...events: Events) {\n const mergedEvent = new Event<UnpackAllParameters<Events>, UnpackAllReturn<Events>>();\n events.forEach((event) => event.on(mergedEvent));\n return mergedEvent;\n }\n\n static interval(interval: number) {\n let counter = 0;\n const intervalEvent = new Event<[number], void>(() => clearInterval(timerId));\n const timerId: NodeJS.Timeout = setInterval(() => intervalEvent(counter++), interval);\n return intervalEvent;\n }\n\n private listeners: Listeners<T, R>;\n readonly dispose: Dispose;\n\n constructor(dispose?: Dispose) {\n const listeners: Listeners<T, R> = [];\n const fn = (...args: T) => eventEmitter(listeners, ...args);\n\n super(fn);\n this.listeners = listeners;\n this.dispose = () => {\n this.clear();\n dispose?.();\n };\n }\n\n get size(): number {\n return this.listeners.length;\n }\n\n lacks(listener: Listener<T, R>): boolean {\n return this.listeners.indexOf(listener) === -1;\n }\n\n has(listener: Listener<T, R>): boolean {\n return this.listeners.indexOf(listener) !== -1;\n }\n\n off(listener: Listener<T, R>): void {\n let index = this.listeners.indexOf(listener);\n while (~index) {\n this.listeners.splice(index, 1);\n index = this.listeners.indexOf(listener);\n }\n }\n\n on(listener: Listener<T, R>): Dismiss {\n this.listeners.push(listener);\n return new Dismiss(() => this.off(listener));\n }\n\n once(listener: Listener<T, R>): Dismiss {\n const oneTimeListener = (...args: T) => {\n this.off(oneTimeListener);\n return listener(...args);\n };\n return this.on(oneTimeListener);\n }\n\n clear() {\n this.listeners.splice(0);\n }\n\n toPromise(): Promise<T> {\n return new Promise((resolve) => this.once((...args) => resolve(args)));\n }\n\n filter(filter: Filter<T>) {\n const dispose = this.on(async (...args) => {\n if (filteredEvent.size > 0 && (await filter(...args))) {\n return filteredEvent(...args);\n }\n });\n const filteredEvent = new Event<T, R>(dispose);\n return filteredEvent;\n }\n\n map<R>(mapper: Mapper<T, R>) {\n const dispose = this.on(async (...args) => {\n if (mappedEvent.size > 0) {\n const value = await mapper(...args);\n mappedEvent(value);\n }\n });\n const mappedEvent = new Event(dispose);\n return mappedEvent;\n }\n\n reduce<R>(reducer: Reducer<T, R>, init: R) {\n let value = init;\n const dispose = this.on(async (...args) => {\n if (reducedEvent.size > 0) {\n value = await reducer(value, ...args);\n reducedEvent(value);\n }\n });\n const reducedEvent = new Event(dispose);\n return reducedEvent;\n }\n}\n\nexport const once = <T extends unknown[], R = void>(event: Event<T, R>): Promise<T> => {\n return new Promise((resolve) => event.once((...args) => resolve(args)));\n};\n\nexport default function createEvent<T extends unknown[], R = void>() {\n return new Event<T, R>();\n}\n"],"names":["Dismiss","Event","once","createEvent","FunctionExt","Function","constructor","func","Object","setPrototypeOf","prototype","dismiss","after","process","afterTimes","count","eventEmitter","listeners","args","Promise","all","map","listener","merge","events","mergedEvent","forEach","event","on","interval","counter","intervalEvent","clearInterval","timerId","setInterval","dispose","fn","clear","size","length","lacks","indexOf","has","off","index","splice","push","oneTimeListener","toPromise","resolve","filter","filteredEvent","mapper","mappedEvent","value","reduce","reducer","init","reducedEvent"],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;
|
|
|
2
2
|
export interface Unsubscribe {
|
|
3
3
|
(): void;
|
|
4
4
|
}
|
|
5
|
-
export interface Listener<T extends unknown[]> {
|
|
6
|
-
(...args: T): void
|
|
5
|
+
export interface Listener<T extends unknown[], R> {
|
|
6
|
+
(...args: T): MaybePromise<R | void>;
|
|
7
7
|
}
|
|
8
8
|
export interface Dispose {
|
|
9
9
|
(): void;
|
|
@@ -17,7 +17,7 @@ export interface Mapper<T extends unknown[], R> {
|
|
|
17
17
|
export interface Reducer<T extends unknown[], R> {
|
|
18
18
|
(value: R, ...args: T): R;
|
|
19
19
|
}
|
|
20
|
-
export type Listeners<T extends unknown[]> = Listener<T>[];
|
|
20
|
+
export type Listeners<T extends unknown[], R> = Listener<T, R>[];
|
|
21
21
|
declare class FunctionExt extends Function {
|
|
22
22
|
constructor(func: Function);
|
|
23
23
|
}
|
|
@@ -29,29 +29,35 @@ export declare class Dismiss extends FunctionExt {
|
|
|
29
29
|
after(process: () => MaybePromise<unknown>): Promise<void>;
|
|
30
30
|
afterTimes(count: number): () => void;
|
|
31
31
|
}
|
|
32
|
-
export interface Event<T extends unknown[]> {
|
|
33
|
-
(...args: T): Promise<
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
export interface Event<T extends unknown[], R> {
|
|
33
|
+
(...args: T): Promise<R> | R;
|
|
34
|
+
}
|
|
35
|
+
type UnpackParameters<T> = T extends Event<infer P, unknown> ? P : never;
|
|
36
|
+
type UnpackReturn<T> = T extends Event<unknown[], infer R> ? R : never;
|
|
37
|
+
type UnpackAllParameters<T extends Event<unknown[], unknown>[]> = {
|
|
38
|
+
[K in keyof T]: UnpackParameters<T[K]>;
|
|
39
|
+
}[number];
|
|
40
|
+
type UnpackAllReturn<T extends Event<unknown[], unknown>[]> = {
|
|
41
|
+
[K in keyof T]: UnpackReturn<T[K]>;
|
|
42
|
+
}[number];
|
|
43
|
+
export declare class Event<T extends unknown[], R = void> extends FunctionExt {
|
|
44
|
+
static merge<Events extends Event<any[], any>[]>(...events: Events): Event<UnpackAllParameters<Events>, UnpackAllReturn<Events>>;
|
|
45
|
+
static interval(interval: number): Event<[number], void>;
|
|
40
46
|
private listeners;
|
|
41
47
|
readonly dispose: Dispose;
|
|
42
48
|
constructor(dispose?: Dispose);
|
|
43
49
|
get size(): number;
|
|
44
|
-
lacks(listener: Listener<T>): boolean;
|
|
45
|
-
has(listener: Listener<T>): boolean;
|
|
46
|
-
off(listener: Listener<T>): void;
|
|
47
|
-
on(listener: Listener<T>): Dismiss;
|
|
48
|
-
once(listener: Listener<T>): Dismiss;
|
|
50
|
+
lacks(listener: Listener<T, R>): boolean;
|
|
51
|
+
has(listener: Listener<T, R>): boolean;
|
|
52
|
+
off(listener: Listener<T, R>): void;
|
|
53
|
+
on(listener: Listener<T, R>): Dismiss;
|
|
54
|
+
once(listener: Listener<T, R>): Dismiss;
|
|
49
55
|
clear(): void;
|
|
50
56
|
toPromise(): Promise<T>;
|
|
51
|
-
filter(filter: Filter<T>): Event<
|
|
52
|
-
map<R>(mapper: Mapper<T, R>): Event<unknown[]>;
|
|
53
|
-
reduce<R>(reducer: Reducer<T, R>, init: R): Event<unknown[]>;
|
|
57
|
+
filter(filter: Filter<T>): Event<T, R>;
|
|
58
|
+
map<R>(mapper: Mapper<T, R>): Event<unknown[], void>;
|
|
59
|
+
reduce<R>(reducer: Reducer<T, R>, init: R): Event<unknown[], void>;
|
|
54
60
|
}
|
|
55
|
-
export declare const once: <T extends
|
|
56
|
-
export default function createEvent<T extends
|
|
61
|
+
export declare const once: <T extends unknown[], R = void>(event: Event<T, R>) => Promise<T>;
|
|
62
|
+
export default function createEvent<T extends unknown[], R = void>(): Event<T, R>;
|
|
57
63
|
export {};
|
package/build/index.js
CHANGED
|
@@ -70,7 +70,7 @@ export class Event extends FunctionExt {
|
|
|
70
70
|
once(listener) {
|
|
71
71
|
const oneTimeListener = (...args)=>{
|
|
72
72
|
this.off(oneTimeListener);
|
|
73
|
-
listener(...args);
|
|
73
|
+
return listener(...args);
|
|
74
74
|
};
|
|
75
75
|
return this.on(oneTimeListener);
|
|
76
76
|
}
|
|
@@ -83,7 +83,7 @@ export class Event extends FunctionExt {
|
|
|
83
83
|
filter(filter) {
|
|
84
84
|
const dispose = this.on(async (...args)=>{
|
|
85
85
|
if (filteredEvent.size > 0 && await filter(...args)) {
|
|
86
|
-
filteredEvent(...args);
|
|
86
|
+
return filteredEvent(...args);
|
|
87
87
|
}
|
|
88
88
|
});
|
|
89
89
|
const filteredEvent = new Event(dispose);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface Unsubscribe {\n (): void;\n}\n\nexport interface Listener<T extends unknown[]> {\n (...args: T): void
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["type MaybePromise<T> = Promise<T> | PromiseLike<T> | T;\n\nexport interface Unsubscribe {\n (): void;\n}\n\nexport interface Listener<T extends unknown[], R> {\n (...args: T): MaybePromise<R | void>;\n}\n\nexport interface Dispose {\n (): void;\n}\n\nexport interface Filter<T extends unknown[]> {\n (...args: T): MaybePromise<boolean>;\n}\n\nexport interface Mapper<T extends unknown[], R> {\n (...args: T): R;\n}\n\nexport interface Reducer<T extends unknown[], R> {\n (value: R, ...args: T): R;\n}\n\nexport type Listeners<T extends unknown[], R> = Listener<T, R>[];\n\nclass FunctionExt extends Function {\n constructor(func: Function) {\n super();\n return Object.setPrototypeOf(func, new.target.prototype);\n }\n}\n\nexport interface Dismiss {\n (): Promise<void> | void;\n}\n\nexport class Dismiss extends FunctionExt {\n constructor(dismiss: Unsubscribe) {\n super(dismiss);\n }\n async after(process: () => MaybePromise<unknown>) {\n await process();\n this();\n }\n afterTimes(count: number) {\n return () => {\n if (!--count) {\n this();\n }\n };\n }\n}\n\nconst eventEmitter = async <A extends unknown[], R>(listeners: Listeners<A, R>, ...args: A) => {\n return Promise.all(listeners.map((listener) => listener(...args)));\n};\n\nexport interface Event<T extends unknown[], R> {\n (...args: T): Promise<R> | R;\n}\n\ntype UnpackParameters<T> = T extends Event<infer P, unknown> ? P : never;\ntype UnpackReturn<T> = T extends Event<unknown[], infer R> ? R : never;\ntype UnpackAllParameters<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackParameters<T[K]> }[number];\ntype UnpackAllReturn<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackReturn<T[K]> }[number];\n\nexport class Event<T extends unknown[], R = void> extends FunctionExt {\n static merge<Events extends Event<any[], any>[]>(...events: Events) {\n const mergedEvent = new Event<UnpackAllParameters<Events>, UnpackAllReturn<Events>>();\n events.forEach((event) => event.on(mergedEvent));\n return mergedEvent;\n }\n\n static interval(interval: number) {\n let counter = 0;\n const intervalEvent = new Event<[number], void>(() => clearInterval(timerId));\n const timerId: NodeJS.Timeout = setInterval(() => intervalEvent(counter++), interval);\n return intervalEvent;\n }\n\n private listeners: Listeners<T, R>;\n readonly dispose: Dispose;\n\n constructor(dispose?: Dispose) {\n const listeners: Listeners<T, R> = [];\n const fn = (...args: T) => eventEmitter(listeners, ...args);\n\n super(fn);\n this.listeners = listeners;\n this.dispose = () => {\n this.clear();\n dispose?.();\n };\n }\n\n get size(): number {\n return this.listeners.length;\n }\n\n lacks(listener: Listener<T, R>): boolean {\n return this.listeners.indexOf(listener) === -1;\n }\n\n has(listener: Listener<T, R>): boolean {\n return this.listeners.indexOf(listener) !== -1;\n }\n\n off(listener: Listener<T, R>): void {\n let index = this.listeners.indexOf(listener);\n while (~index) {\n this.listeners.splice(index, 1);\n index = this.listeners.indexOf(listener);\n }\n }\n\n on(listener: Listener<T, R>): Dismiss {\n this.listeners.push(listener);\n return new Dismiss(() => this.off(listener));\n }\n\n once(listener: Listener<T, R>): Dismiss {\n const oneTimeListener = (...args: T) => {\n this.off(oneTimeListener);\n return listener(...args);\n };\n return this.on(oneTimeListener);\n }\n\n clear() {\n this.listeners.splice(0);\n }\n\n toPromise(): Promise<T> {\n return new Promise((resolve) => this.once((...args) => resolve(args)));\n }\n\n filter(filter: Filter<T>) {\n const dispose = this.on(async (...args) => {\n if (filteredEvent.size > 0 && (await filter(...args))) {\n return filteredEvent(...args);\n }\n });\n const filteredEvent = new Event<T, R>(dispose);\n return filteredEvent;\n }\n\n map<R>(mapper: Mapper<T, R>) {\n const dispose = this.on(async (...args) => {\n if (mappedEvent.size > 0) {\n const value = await mapper(...args);\n mappedEvent(value);\n }\n });\n const mappedEvent = new Event(dispose);\n return mappedEvent;\n }\n\n reduce<R>(reducer: Reducer<T, R>, init: R) {\n let value = init;\n const dispose = this.on(async (...args) => {\n if (reducedEvent.size > 0) {\n value = await reducer(value, ...args);\n reducedEvent(value);\n }\n });\n const reducedEvent = new Event(dispose);\n return reducedEvent;\n }\n}\n\nexport const once = <T extends unknown[], R = void>(event: Event<T, R>): Promise<T> => {\n return new Promise((resolve) => event.once((...args) => resolve(args)));\n};\n\nexport default function createEvent<T extends unknown[], R = void>() {\n return new Event<T, R>();\n}\n"],"names":["FunctionExt","Function","constructor","func","Object","setPrototypeOf","prototype","Dismiss","dismiss","after","process","afterTimes","count","eventEmitter","listeners","args","Promise","all","map","listener","Event","merge","events","mergedEvent","forEach","event","on","interval","counter","intervalEvent","clearInterval","timerId","setInterval","dispose","fn","clear","size","length","lacks","indexOf","has","off","index","splice","push","once","oneTimeListener","toPromise","resolve","filter","filteredEvent","mapper","mappedEvent","value","reduce","reducer","init","reducedEvent","createEvent"],"mappings":"AA4BA,MAAMA,oBAAoBC;IACxBC,YAAYC,IAAc,CAAE;QAC1B,KAAK;QACL,OAAOC,OAAOC,cAAc,CAACF,MAAM,WAAWG,SAAS;IACzD;AACF;AAMA,OAAO,MAAMC,gBAAgBP;IAC3BE,YAAYM,OAAoB,CAAE;QAChC,KAAK,CAACA;IACR;IACA,MAAMC,MAAMC,OAAoC,EAAE;QAChD,MAAMA;QACN,IAAI;IACN;IACAC,WAAWC,KAAa,EAAE;QACxB,OAAO;YACL,IAAI,CAAC,EAAEA,OAAO;gBACZ,IAAI;YACN;QACF;IACF;AACF;AAEA,MAAMC,eAAe,OAA+BC,WAA4B,GAAGC;IACjF,OAAOC,QAAQC,GAAG,CAACH,UAAUI,GAAG,CAAC,CAACC,WAAaA,YAAYJ;AAC7D;AAWA,OAAO,MAAMK,cAA6CpB;IACxD,OAAOqB,MAA0C,GAAGC,MAAc,EAAE;QAClE,MAAMC,cAAc,IAAIH;QACxBE,OAAOE,OAAO,CAAC,CAACC,QAAUA,MAAMC,EAAE,CAACH;QACnC,OAAOA;IACT;IAEA,OAAOI,SAASA,QAAgB,EAAE;QAChC,IAAIC,UAAU;QACd,MAAMC,gBAAgB,IAAIT,MAAsB,IAAMU,cAAcC;QACpE,MAAMA,UAA0BC,YAAY,IAAMH,cAAcD,YAAYD;QAC5E,OAAOE;IACT;IAEQf,UAA2B;IAC1BmB,QAAiB;IAE1B/B,YAAY+B,OAAiB,CAAE;QAC7B,MAAMnB,YAA6B,EAAE;QACrC,MAAMoB,KAAK,CAAC,GAAGnB,OAAYF,aAAaC,cAAcC;QAEtD,KAAK,CAACmB;QACN,IAAI,CAACpB,SAAS,GAAGA;QACjB,IAAI,CAACmB,OAAO,GAAG;YACb,IAAI,CAACE,KAAK;YACVF;QACF;IACF;IAEA,IAAIG,OAAe;QACjB,OAAO,IAAI,CAACtB,SAAS,CAACuB,MAAM;IAC9B;IAEAC,MAAMnB,QAAwB,EAAW;QACvC,OAAO,IAAI,CAACL,SAAS,CAACyB,OAAO,CAACpB,cAAc,CAAC;IAC/C;IAEAqB,IAAIrB,QAAwB,EAAW;QACrC,OAAO,IAAI,CAACL,SAAS,CAACyB,OAAO,CAACpB,cAAc,CAAC;IAC/C;IAEAsB,IAAItB,QAAwB,EAAQ;QAClC,IAAIuB,QAAQ,IAAI,CAAC5B,SAAS,CAACyB,OAAO,CAACpB;QACnC,MAAO,CAACuB,MAAO;YACb,IAAI,CAAC5B,SAAS,CAAC6B,MAAM,CAACD,OAAO;YAC7BA,QAAQ,IAAI,CAAC5B,SAAS,CAACyB,OAAO,CAACpB;QACjC;IACF;IAEAO,GAAGP,QAAwB,EAAW;QACpC,IAAI,CAACL,SAAS,CAAC8B,IAAI,CAACzB;QACpB,OAAO,IAAIZ,QAAQ,IAAM,IAAI,CAACkC,GAAG,CAACtB;IACpC;IAEA0B,KAAK1B,QAAwB,EAAW;QACtC,MAAM2B,kBAAkB,CAAC,GAAG/B;YAC1B,IAAI,CAAC0B,GAAG,CAACK;YACT,OAAO3B,YAAYJ;QACrB;QACA,OAAO,IAAI,CAACW,EAAE,CAACoB;IACjB;IAEAX,QAAQ;QACN,IAAI,CAACrB,SAAS,CAAC6B,MAAM,CAAC;IACxB;IAEAI,YAAwB;QACtB,OAAO,IAAI/B,QAAQ,CAACgC,UAAY,IAAI,CAACH,IAAI,CAAC,CAAC,GAAG9B,OAASiC,QAAQjC;IACjE;IAEAkC,OAAOA,MAAiB,EAAE;QACxB,MAAMhB,UAAU,IAAI,CAACP,EAAE,CAAC,OAAO,GAAGX;YAChC,IAAImC,cAAcd,IAAI,GAAG,KAAM,MAAMa,UAAUlC,OAAQ;gBACrD,OAAOmC,iBAAiBnC;YAC1B;QACF;QACA,MAAMmC,gBAAgB,IAAI9B,MAAYa;QACtC,OAAOiB;IACT;IAEAhC,IAAOiC,MAAoB,EAAE;QAC3B,MAAMlB,UAAU,IAAI,CAACP,EAAE,CAAC,OAAO,GAAGX;YAChC,IAAIqC,YAAYhB,IAAI,GAAG,GAAG;gBACxB,MAAMiB,QAAQ,MAAMF,UAAUpC;gBAC9BqC,YAAYC;YACd;QACF;QACA,MAAMD,cAAc,IAAIhC,MAAMa;QAC9B,OAAOmB;IACT;IAEAE,OAAUC,OAAsB,EAAEC,IAAO,EAAE;QACzC,IAAIH,QAAQG;QACZ,MAAMvB,UAAU,IAAI,CAACP,EAAE,CAAC,OAAO,GAAGX;YAChC,IAAI0C,aAAarB,IAAI,GAAG,GAAG;gBACzBiB,QAAQ,MAAME,QAAQF,UAAUtC;gBAChC0C,aAAaJ;YACf;QACF;QACA,MAAMI,eAAe,IAAIrC,MAAMa;QAC/B,OAAOwB;IACT;AACF;AAEA,OAAO,MAAMZ,OAAO,CAAgCpB;IAClD,OAAO,IAAIT,QAAQ,CAACgC,UAAYvB,MAAMoB,IAAI,CAAC,CAAC,GAAG9B,OAASiC,QAAQjC;AAClE,EAAE;AAEF,eAAe,SAAS2C;IACtB,OAAO,IAAItC;AACb"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -4,8 +4,8 @@ export interface Unsubscribe {
|
|
|
4
4
|
(): void;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export interface Listener<T extends unknown[]> {
|
|
8
|
-
(...args: T): void
|
|
7
|
+
export interface Listener<T extends unknown[], R> {
|
|
8
|
+
(...args: T): MaybePromise<R | void>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export interface Dispose {
|
|
@@ -24,7 +24,7 @@ export interface Reducer<T extends unknown[], R> {
|
|
|
24
24
|
(value: R, ...args: T): R;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export type Listeners<T extends unknown[]> = Listener<T>[];
|
|
27
|
+
export type Listeners<T extends unknown[], R> = Listener<T, R>[];
|
|
28
28
|
|
|
29
29
|
class FunctionExt extends Function {
|
|
30
30
|
constructor(func: Function) {
|
|
@@ -54,37 +54,38 @@ export class Dismiss extends FunctionExt {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
const eventEmitter = async <A extends unknown[]>(listeners: Listeners<A>, ...args: A) => {
|
|
57
|
+
const eventEmitter = async <A extends unknown[], R>(listeners: Listeners<A, R>, ...args: A) => {
|
|
58
58
|
return Promise.all(listeners.map((listener) => listener(...args)));
|
|
59
59
|
};
|
|
60
60
|
|
|
61
|
-
export interface Event<T extends unknown[]> {
|
|
62
|
-
(...args: T): Promise<
|
|
61
|
+
export interface Event<T extends unknown[], R> {
|
|
62
|
+
(...args: T): Promise<R> | R;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
type UnpackParameters<T> = T extends Event<infer P, unknown> ? P : never;
|
|
66
|
+
type UnpackReturn<T> = T extends Event<unknown[], infer R> ? R : never;
|
|
67
|
+
type UnpackAllParameters<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackParameters<T[K]> }[number];
|
|
68
|
+
type UnpackAllReturn<T extends Event<unknown[], unknown>[]> = { [K in keyof T]: UnpackReturn<T[K]> }[number];
|
|
69
|
+
|
|
70
|
+
export class Event<T extends unknown[], R = void> extends FunctionExt {
|
|
71
|
+
static merge<Events extends Event<any[], any>[]>(...events: Events) {
|
|
72
|
+
const mergedEvent = new Event<UnpackAllParameters<Events>, UnpackAllReturn<Events>>();
|
|
72
73
|
events.forEach((event) => event.on(mergedEvent));
|
|
73
74
|
return mergedEvent;
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
static interval(interval: number) {
|
|
77
78
|
let counter = 0;
|
|
78
|
-
const intervalEvent = new Event<[number]>(() => clearInterval(timerId));
|
|
79
|
+
const intervalEvent = new Event<[number], void>(() => clearInterval(timerId));
|
|
79
80
|
const timerId: NodeJS.Timeout = setInterval(() => intervalEvent(counter++), interval);
|
|
80
81
|
return intervalEvent;
|
|
81
82
|
}
|
|
82
83
|
|
|
83
|
-
private listeners: Listeners<T>;
|
|
84
|
+
private listeners: Listeners<T, R>;
|
|
84
85
|
readonly dispose: Dispose;
|
|
85
86
|
|
|
86
87
|
constructor(dispose?: Dispose) {
|
|
87
|
-
const listeners: Listeners<T> = [];
|
|
88
|
+
const listeners: Listeners<T, R> = [];
|
|
88
89
|
const fn = (...args: T) => eventEmitter(listeners, ...args);
|
|
89
90
|
|
|
90
91
|
super(fn);
|
|
@@ -99,15 +100,15 @@ export class Event<T extends unknown[]> extends FunctionExt {
|
|
|
99
100
|
return this.listeners.length;
|
|
100
101
|
}
|
|
101
102
|
|
|
102
|
-
lacks(listener: Listener<T>): boolean {
|
|
103
|
+
lacks(listener: Listener<T, R>): boolean {
|
|
103
104
|
return this.listeners.indexOf(listener) === -1;
|
|
104
105
|
}
|
|
105
106
|
|
|
106
|
-
has(listener: Listener<T>): boolean {
|
|
107
|
+
has(listener: Listener<T, R>): boolean {
|
|
107
108
|
return this.listeners.indexOf(listener) !== -1;
|
|
108
109
|
}
|
|
109
110
|
|
|
110
|
-
off(listener: Listener<T>): void {
|
|
111
|
+
off(listener: Listener<T, R>): void {
|
|
111
112
|
let index = this.listeners.indexOf(listener);
|
|
112
113
|
while (~index) {
|
|
113
114
|
this.listeners.splice(index, 1);
|
|
@@ -115,15 +116,15 @@ export class Event<T extends unknown[]> extends FunctionExt {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
on(listener: Listener<T>): Dismiss {
|
|
119
|
+
on(listener: Listener<T, R>): Dismiss {
|
|
119
120
|
this.listeners.push(listener);
|
|
120
121
|
return new Dismiss(() => this.off(listener));
|
|
121
122
|
}
|
|
122
123
|
|
|
123
|
-
once(listener: Listener<T>): Dismiss {
|
|
124
|
+
once(listener: Listener<T, R>): Dismiss {
|
|
124
125
|
const oneTimeListener = (...args: T) => {
|
|
125
126
|
this.off(oneTimeListener);
|
|
126
|
-
listener(...args);
|
|
127
|
+
return listener(...args);
|
|
127
128
|
};
|
|
128
129
|
return this.on(oneTimeListener);
|
|
129
130
|
}
|
|
@@ -139,10 +140,10 @@ export class Event<T extends unknown[]> extends FunctionExt {
|
|
|
139
140
|
filter(filter: Filter<T>) {
|
|
140
141
|
const dispose = this.on(async (...args) => {
|
|
141
142
|
if (filteredEvent.size > 0 && (await filter(...args))) {
|
|
142
|
-
filteredEvent(...args);
|
|
143
|
+
return filteredEvent(...args);
|
|
143
144
|
}
|
|
144
145
|
});
|
|
145
|
-
const filteredEvent = new Event(dispose);
|
|
146
|
+
const filteredEvent = new Event<T, R>(dispose);
|
|
146
147
|
return filteredEvent;
|
|
147
148
|
}
|
|
148
149
|
|
|
@@ -170,10 +171,10 @@ export class Event<T extends unknown[]> extends FunctionExt {
|
|
|
170
171
|
}
|
|
171
172
|
}
|
|
172
173
|
|
|
173
|
-
export const once = <T extends
|
|
174
|
+
export const once = <T extends unknown[], R = void>(event: Event<T, R>): Promise<T> => {
|
|
174
175
|
return new Promise((resolve) => event.once((...args) => resolve(args)));
|
|
175
176
|
};
|
|
176
177
|
|
|
177
|
-
export default function createEvent<T extends
|
|
178
|
-
return new Event<T>();
|
|
178
|
+
export default function createEvent<T extends unknown[], R = void>() {
|
|
179
|
+
return new Event<T, R>();
|
|
179
180
|
}
|