evnty 0.6.22 → 0.7.0
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/.eslintignore +3 -0
- package/.eslintrc +26 -0
- package/.prettierrc +7 -0
- package/LICENSE +13 -0
- package/README.md +2 -2
- package/build/index.d.ts +26 -23
- package/build/index.js +6 -8
- package/build/index.js.map +1 -1
- package/package.json +17 -6
- package/src/__tests__/index.ts +6 -2
- package/src/index.ts +42 -37
- package/tsconfig.json +1 -0
package/.eslintignore
ADDED
package/.eslintrc
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"overrides": [
|
|
3
|
+
{
|
|
4
|
+
"env": {
|
|
5
|
+
"es2020": true
|
|
6
|
+
},
|
|
7
|
+
"files": "**/*.js",
|
|
8
|
+
"extends": ["prettier", "eslint-config-airbnb-base"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"env": {
|
|
12
|
+
"es2020": true
|
|
13
|
+
},
|
|
14
|
+
"files": "**/*.ts",
|
|
15
|
+
"extends": ["prettier", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended"],
|
|
16
|
+
"parser": "@typescript-eslint/parser",
|
|
17
|
+
"plugins": ["@typescript-eslint"],
|
|
18
|
+
"rules": {
|
|
19
|
+
"@typescript-eslint/no-unused-vars": 2,
|
|
20
|
+
"@typescript-eslint/no-explicit-any": 0,
|
|
21
|
+
"@typescript-eslint/ban-types": 0,
|
|
22
|
+
"@typescript-eslint/ban-ts-comment": 1
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
package/.prettierrc
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright (c) 2021-present Ivan Zakharchanka
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
package/README.md
CHANGED
|
@@ -76,8 +76,8 @@ unsubscribe();
|
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
## License
|
|
79
|
-
License [
|
|
80
|
-
Copyright (c) 2021 Ivan Zakharchanka
|
|
79
|
+
License [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
|
80
|
+
Copyright (c) 2021-present Ivan Zakharchanka
|
|
81
81
|
|
|
82
82
|
[npm-url]: https://www.npmjs.com/package/evnty
|
|
83
83
|
[downloads-image]: https://img.shields.io/npm/dw/evnty.svg?maxAge=43200
|
package/build/index.d.ts
CHANGED
|
@@ -1,42 +1,45 @@
|
|
|
1
1
|
export interface Unsubscribe {
|
|
2
2
|
(): void;
|
|
3
3
|
}
|
|
4
|
-
export interface Listener {
|
|
5
|
-
(...args:
|
|
4
|
+
export interface Listener<T extends any[]> {
|
|
5
|
+
(...args: T): void;
|
|
6
6
|
}
|
|
7
7
|
export interface Dispose {
|
|
8
8
|
(): void;
|
|
9
9
|
}
|
|
10
|
-
export interface Filter {
|
|
11
|
-
(...args:
|
|
10
|
+
export interface Filter<T extends any[]> {
|
|
11
|
+
(...args: T): boolean;
|
|
12
12
|
}
|
|
13
|
-
export interface Mapper<T
|
|
14
|
-
(...args:
|
|
13
|
+
export interface Mapper<T extends any[], R> {
|
|
14
|
+
(...args: T): R;
|
|
15
15
|
}
|
|
16
|
-
export interface Reducer<T
|
|
17
|
-
(value:
|
|
18
|
-
}
|
|
19
|
-
export interface Listeners extends Set<Listener> {
|
|
16
|
+
export interface Reducer<T extends any[], R> {
|
|
17
|
+
(value: R, ...args: T): R;
|
|
20
18
|
}
|
|
19
|
+
export declare type Listeners<T extends any[]> = Set<Listener<T>>;
|
|
21
20
|
declare class FunctionExt extends Function {
|
|
22
21
|
constructor(func: Function);
|
|
23
22
|
}
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
export interface Event<T extends any[]> {
|
|
24
|
+
(...args: T): Promise<void> | void;
|
|
25
|
+
}
|
|
26
|
+
declare type EventTypes<T extends Event<any>[]> = T extends Event<infer E>[] ? E : never;
|
|
27
|
+
export declare class Event<T extends any[]> extends FunctionExt {
|
|
28
|
+
static merge<E extends Event<unknown[]>[], ET extends any[] = EventTypes<E>>(...events: E): Event<ET>;
|
|
29
|
+
static interval(interval: number): Event<[number]>;
|
|
27
30
|
private listeners;
|
|
28
31
|
readonly dispose: Dispose;
|
|
29
32
|
constructor(dispose?: Dispose);
|
|
30
|
-
get size():
|
|
31
|
-
has(listener: Listener): boolean;
|
|
32
|
-
off(listener: Listener): void;
|
|
33
|
-
on(listener: Listener): Unsubscribe;
|
|
34
|
-
once(listener: Listener): Unsubscribe;
|
|
33
|
+
get size(): number;
|
|
34
|
+
has(listener: Listener<T>): boolean;
|
|
35
|
+
off(listener: Listener<T>): void;
|
|
36
|
+
on(listener: Listener<T>): Unsubscribe;
|
|
37
|
+
once(listener: Listener<T>): Unsubscribe;
|
|
35
38
|
clear(): void;
|
|
36
|
-
toPromise(): Promise<
|
|
37
|
-
filter(filter: Filter): Event
|
|
38
|
-
map<
|
|
39
|
-
reduce<
|
|
39
|
+
toPromise(): Promise<T>;
|
|
40
|
+
filter(filter: Filter<T>): Event<any[]>;
|
|
41
|
+
map<R>(mapper: Mapper<T, R>): Event<any[]>;
|
|
42
|
+
reduce<R>(reducer: Reducer<T, R>, init: R): Event<any[]>;
|
|
40
43
|
}
|
|
41
|
-
export default function
|
|
44
|
+
export default function createEvent(): Event<any[]>;
|
|
42
45
|
export {};
|
package/build/index.js
CHANGED
|
@@ -13,16 +13,17 @@ exports.Event = void 0;
|
|
|
13
13
|
class FunctionExt extends Function {
|
|
14
14
|
constructor(func) {
|
|
15
15
|
super();
|
|
16
|
-
|
|
16
|
+
Object.setPrototypeOf(func, new.target.prototype);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
function eventEmitter(listeners, ...args) {
|
|
20
|
-
return Promise.all([...listeners].map(listener => listener(...args)));
|
|
20
|
+
return Promise.all([...listeners].map(listener => listener(...args))).then(() => { });
|
|
21
21
|
}
|
|
22
22
|
class Event extends FunctionExt {
|
|
23
23
|
constructor(dispose) {
|
|
24
24
|
const listeners = new Set();
|
|
25
|
-
|
|
25
|
+
const fn = eventEmitter.bind(null, listeners);
|
|
26
|
+
super(fn);
|
|
26
27
|
this.listeners = listeners;
|
|
27
28
|
this.dispose = () => {
|
|
28
29
|
this.clear();
|
|
@@ -50,12 +51,10 @@ class Event extends FunctionExt {
|
|
|
50
51
|
off(listener) {
|
|
51
52
|
this.listeners.delete(listener);
|
|
52
53
|
}
|
|
53
|
-
;
|
|
54
54
|
on(listener) {
|
|
55
55
|
this.listeners.add(listener);
|
|
56
56
|
return () => this.off(listener);
|
|
57
57
|
}
|
|
58
|
-
;
|
|
59
58
|
once(listener) {
|
|
60
59
|
const oneTimeListener = (...args) => {
|
|
61
60
|
this.off(oneTimeListener);
|
|
@@ -63,7 +62,6 @@ class Event extends FunctionExt {
|
|
|
63
62
|
};
|
|
64
63
|
return this.on(oneTimeListener);
|
|
65
64
|
}
|
|
66
|
-
;
|
|
67
65
|
clear() {
|
|
68
66
|
this.listeners.clear();
|
|
69
67
|
}
|
|
@@ -102,8 +100,8 @@ class Event extends FunctionExt {
|
|
|
102
100
|
}
|
|
103
101
|
}
|
|
104
102
|
exports.Event = Event;
|
|
105
|
-
function
|
|
103
|
+
function createEvent() {
|
|
106
104
|
return new Event();
|
|
107
105
|
}
|
|
108
|
-
exports.default =
|
|
106
|
+
exports.default = createEvent;
|
|
109
107
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AA0BA,MAAM,WAAY,SAAQ,QAAQ;IAChC,YAAY,IAAc;QACxB,KAAK,EAAE,CAAC;QACR,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,SAAS,YAAY,CAAkB,SAAuB,EAAE,GAAG,IAAO;IACxE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACxF,CAAC;AAQD,MAAa,KAAuB,SAAQ,WAAW;IAkBrD,YAAY,OAAiB;QAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAe,CAAC;QACzC,MAAM,EAAE,GAAkC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7E,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,OAAO,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IA1BD,MAAM,CAAC,KAAK,CAAiE,GAAG,MAAS;QACvF,MAAM,WAAW,GAAG,IAAI,KAAK,EAAM,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAgB;QAC9B,IAAI,OAAO,GAAQ,CAAC,CAAC;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,aAAa,GAAG,IAAI,KAAK,CAAW,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChE,OAAO,aAAa,CAAC;IACvB,CAAC;IAgBD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,QAAqB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,QAAqB;QACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,EAAE,CAAC,QAAqB;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,QAAqB;QACxB,MAAM,eAAe,GAAG,CAAC,GAAG,IAAO,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1B,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,MAAiB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAO,GAAG,IAAI,EAAE,EAAE;YACxC,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,KAAI,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA,EAAE;gBACnD,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;aACxB;QACH,CAAC,CAAA,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,GAAG,CAAI,MAAoB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAO,GAAG,IAAI,EAAE,EAAE;YACxC,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE;gBACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpC,WAAW,CAAC,KAAK,CAAC,CAAC;aACpB;QACH,CAAC,CAAA,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,CAAI,OAAsB,EAAE,IAAO;QACvC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAO,GAAG,IAAI,EAAE,EAAE;YACxC,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;gBACzB,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;gBACtC,YAAY,CAAC,KAAK,CAAC,CAAC;aACrB;QACH,CAAC,CAAA,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AA9FD,sBA8FC;AAED,SAAwB,WAAW;IACjC,OAAO,IAAI,KAAK,EAAE,CAAC;AACrB,CAAC;AAFD,8BAEC"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evnty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "0-Deps, simple, fast, for browser and node js anonymous event library",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "rm -rf build && NODE_ENV=production tsc",
|
|
9
9
|
"test": "jest",
|
|
10
|
-
"test:cov": "COVERAGE=true jest"
|
|
10
|
+
"test:cov": "COVERAGE=true jest",
|
|
11
|
+
"lint": "eslint .",
|
|
12
|
+
"prepare": "husky install"
|
|
11
13
|
},
|
|
12
14
|
"repository": {
|
|
13
15
|
"type": "git",
|
|
@@ -28,10 +30,19 @@
|
|
|
28
30
|
},
|
|
29
31
|
"homepage": "https://github.com/3axap4eHko/evnty#readme",
|
|
30
32
|
"devDependencies": {
|
|
31
|
-
"@types/jest": "^
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
33
|
+
"@types/jest": "^27.4.1",
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^5.20.0",
|
|
35
|
+
"@typescript-eslint/parser": "^5.20.0",
|
|
36
|
+
"eslint": "^8.13.0",
|
|
37
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
38
|
+
"eslint-config-prettier": "^8.5.0",
|
|
39
|
+
"eslint-plugin-import": "^2.26.0",
|
|
40
|
+
"husky": "^7.0.4",
|
|
41
|
+
"jest": "^27.5.1",
|
|
42
|
+
"prettier": "^2.6.2",
|
|
43
|
+
"pretty-quick": "^3.1.3",
|
|
44
|
+
"ts-jest": "^27.1.4",
|
|
45
|
+
"ts-node": "^10.7.0",
|
|
35
46
|
"typescript": "^4.1.5"
|
|
36
47
|
}
|
|
37
48
|
}
|
package/src/__tests__/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createEvent, { Event } from '../index';
|
|
2
2
|
|
|
3
3
|
describe('Anonymous Event test suite', function () {
|
|
4
4
|
it('Should be instantiable', () => {
|
|
@@ -6,7 +6,11 @@ describe('Anonymous Event test suite', function () {
|
|
|
6
6
|
});
|
|
7
7
|
|
|
8
8
|
it('Should be instantiable', () => {
|
|
9
|
-
expect(() =>
|
|
9
|
+
expect(() => createEvent()).not.toThrow();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('Should be instantiable', () => {
|
|
13
|
+
expect(() => createEvent()).not.toThrow();
|
|
10
14
|
});
|
|
11
15
|
|
|
12
16
|
it('Should call parent constructor', () => {
|
package/src/index.ts
CHANGED
|
@@ -2,62 +2,67 @@ export interface Unsubscribe {
|
|
|
2
2
|
(): void;
|
|
3
3
|
}
|
|
4
4
|
|
|
5
|
-
export interface Listener {
|
|
6
|
-
(...args:
|
|
5
|
+
export interface Listener<T extends any[]> {
|
|
6
|
+
(...args: T): void;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export interface Dispose {
|
|
10
10
|
(): void
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export interface Filter {
|
|
14
|
-
(...args:
|
|
13
|
+
export interface Filter<T extends any[]> {
|
|
14
|
+
(...args: T): boolean
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export interface Mapper<T
|
|
18
|
-
(...args:
|
|
17
|
+
export interface Mapper<T extends any[], R> {
|
|
18
|
+
(...args: T): R;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export interface Reducer<T
|
|
22
|
-
(value:
|
|
21
|
+
export interface Reducer<T extends any[], R> {
|
|
22
|
+
(value: R, ...args: T): R
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export
|
|
26
|
-
|
|
27
|
-
}
|
|
25
|
+
export type Listeners<T extends any[]> = Set<Listener<T>>;
|
|
28
26
|
|
|
29
27
|
class FunctionExt extends Function {
|
|
30
28
|
constructor(func: Function) {
|
|
31
29
|
super();
|
|
32
|
-
|
|
30
|
+
Object.setPrototypeOf(func, new.target.prototype);
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
33
|
|
|
36
|
-
function eventEmitter(listeners: Listeners
|
|
37
|
-
return Promise.all([...listeners].map(listener => listener(...args)));
|
|
34
|
+
function eventEmitter<A extends any[]>(listeners: Listeners<A>, ...args: A) {
|
|
35
|
+
return Promise.all([...listeners].map(listener => listener(...args))).then(() => { });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface Event<T extends any[]> {
|
|
39
|
+
(...args: T): Promise<void> | void;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
type EventTypes<T extends Event<any>[]> = T extends Event<infer E>[] ? E : never;
|
|
43
|
+
|
|
44
|
+
export class Event<T extends any[]> extends FunctionExt {
|
|
45
|
+
static merge<E extends Event<unknown[]>[], ET extends any[] = EventTypes<E>>(...events: E) {
|
|
46
|
+
const mergedEvent = new Event<ET>();
|
|
47
|
+
events.forEach(event => event.on((...args: ET) => mergedEvent(...args)));
|
|
44
48
|
return mergedEvent;
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
static interval(interval: number) {
|
|
48
52
|
let timerId: any = 0;
|
|
49
53
|
let counter = 0;
|
|
50
|
-
const intervalEvent = new Event(() => clearInterval(timerId));
|
|
54
|
+
const intervalEvent = new Event<[number]>(() => clearInterval(timerId));
|
|
51
55
|
timerId = setInterval(() => intervalEvent(counter++), interval);
|
|
52
56
|
return intervalEvent;
|
|
53
57
|
}
|
|
54
58
|
|
|
55
|
-
private listeners: Listeners
|
|
59
|
+
private listeners: Listeners<T>;
|
|
56
60
|
readonly dispose: Dispose;
|
|
57
61
|
|
|
58
62
|
constructor(dispose?: Dispose) {
|
|
59
|
-
const listeners = new Set<Listener
|
|
60
|
-
|
|
63
|
+
const listeners = new Set<Listener<T>>();
|
|
64
|
+
const fn: (...args: T) => Promise<void> = eventEmitter.bind(null, listeners);
|
|
65
|
+
super(fn);
|
|
61
66
|
this.listeners = listeners;
|
|
62
67
|
this.dispose = () => {
|
|
63
68
|
this.clear();
|
|
@@ -65,40 +70,40 @@ export class Event extends FunctionExt {
|
|
|
65
70
|
};
|
|
66
71
|
}
|
|
67
72
|
|
|
68
|
-
get size():
|
|
73
|
+
get size(): number {
|
|
69
74
|
return this.listeners.size;
|
|
70
75
|
}
|
|
71
76
|
|
|
72
|
-
has(listener: Listener): boolean {
|
|
77
|
+
has(listener: Listener<T>): boolean {
|
|
73
78
|
return this.listeners.has(listener);
|
|
74
79
|
}
|
|
75
80
|
|
|
76
|
-
off(listener: Listener): void {
|
|
81
|
+
off(listener: Listener<T>): void {
|
|
77
82
|
this.listeners.delete(listener);
|
|
78
|
-
}
|
|
83
|
+
}
|
|
79
84
|
|
|
80
|
-
on(listener: Listener): Unsubscribe {
|
|
85
|
+
on(listener: Listener<T>): Unsubscribe {
|
|
81
86
|
this.listeners.add(listener);
|
|
82
87
|
return () => this.off(listener);
|
|
83
|
-
}
|
|
88
|
+
}
|
|
84
89
|
|
|
85
|
-
once(listener: Listener): Unsubscribe {
|
|
86
|
-
const oneTimeListener = (...args:
|
|
90
|
+
once(listener: Listener<T>): Unsubscribe {
|
|
91
|
+
const oneTimeListener = (...args: T) => {
|
|
87
92
|
this.off(oneTimeListener);
|
|
88
93
|
listener(...args);
|
|
89
94
|
};
|
|
90
95
|
return this.on(oneTimeListener);
|
|
91
|
-
}
|
|
96
|
+
}
|
|
92
97
|
|
|
93
98
|
clear() {
|
|
94
99
|
this.listeners.clear();
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
toPromise(): Promise<
|
|
102
|
+
toPromise(): Promise<T> {
|
|
98
103
|
return new Promise(resolve => this.once((...args) => resolve(args)));
|
|
99
104
|
}
|
|
100
105
|
|
|
101
|
-
filter(filter: Filter) {
|
|
106
|
+
filter(filter: Filter<T>) {
|
|
102
107
|
const dispose = this.on(async (...args) => {
|
|
103
108
|
if (filteredEvent.size > 0 && await filter(...args)) {
|
|
104
109
|
filteredEvent(...args);
|
|
@@ -108,7 +113,7 @@ export class Event extends FunctionExt {
|
|
|
108
113
|
return filteredEvent;
|
|
109
114
|
}
|
|
110
115
|
|
|
111
|
-
map<
|
|
116
|
+
map<R>(mapper: Mapper<T, R>) {
|
|
112
117
|
const dispose = this.on(async (...args) => {
|
|
113
118
|
if (mappedEvent.size > 0) {
|
|
114
119
|
const value = await mapper(...args);
|
|
@@ -119,8 +124,8 @@ export class Event extends FunctionExt {
|
|
|
119
124
|
return mappedEvent;
|
|
120
125
|
}
|
|
121
126
|
|
|
122
|
-
reduce<
|
|
123
|
-
let value
|
|
127
|
+
reduce<R>(reducer: Reducer<T, R>, init: R) {
|
|
128
|
+
let value = init;
|
|
124
129
|
const dispose = this.on(async (...args) => {
|
|
125
130
|
if (reducedEvent.size > 0) {
|
|
126
131
|
value = await reducer(value, ...args);
|
|
@@ -132,6 +137,6 @@ export class Event extends FunctionExt {
|
|
|
132
137
|
}
|
|
133
138
|
}
|
|
134
139
|
|
|
135
|
-
export default function
|
|
140
|
+
export default function createEvent() {
|
|
136
141
|
return new Event();
|
|
137
142
|
}
|