@yume-chan/event 0.0.5 → 0.0.10
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/CHANGELOG.json +17 -0
- package/CHANGELOG.md +14 -0
- package/LICENSE +21 -21
- package/README.md +112 -112
- package/dts/event.d.ts +6 -0
- package/dts/event.d.ts.map +1 -1
- package/dts/index.d.ts +1 -0
- package/dts/index.d.ts.map +1 -1
- package/dts/utils.d.ts +3 -0
- package/dts/utils.d.ts.map +1 -0
- package/esm/disposable.js +12 -32
- package/esm/disposable.js.map +1 -1
- package/esm/event-emitter.js +20 -39
- package/esm/event-emitter.js.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/utils.js +12 -0
- package/esm/utils.js.map +1 -0
- package/package.json +43 -49
- package/src/disposable.ts +30 -30
- package/src/event-emitter.ts +62 -62
- package/src/event.ts +25 -19
- package/src/index.ts +4 -3
- package/src/utils.ts +10 -0
- package/cjs/disposable.js +0 -45
- package/cjs/disposable.js.map +0 -1
- package/cjs/event-emitter.js +0 -56
- package/cjs/event-emitter.js.map +0 -1
- package/cjs/event.js +0 -3
- package/cjs/event.js.map +0 -1
- package/cjs/index.js +0 -7
- package/cjs/index.js.map +0 -1
- package/tsconfig.cjs.json +0 -11
- package/tsconfig.esm.json +0 -15
package/CHANGELOG.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yume-chan/event",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.0.10",
|
|
6
|
+
"tag": "@yume-chan/event_v0.0.10",
|
|
7
|
+
"date": "Sun, 09 Jan 2022 15:52:20 GMT",
|
|
8
|
+
"comments": {}
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"version": "0.0.9",
|
|
12
|
+
"tag": "@yume-chan/event_v0.0.9",
|
|
13
|
+
"date": "Sun, 09 Jan 2022 15:50:20 GMT",
|
|
14
|
+
"comments": {}
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Change Log - @yume-chan/event
|
|
2
|
+
|
|
3
|
+
This log was last generated on Sun, 09 Jan 2022 15:52:20 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.0.10
|
|
6
|
+
Sun, 09 Jan 2022 15:52:20 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 0.0.9
|
|
11
|
+
Sun, 09 Jan 2022 15:50:20 GMT
|
|
12
|
+
|
|
13
|
+
_Initial release_
|
|
14
|
+
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2020 Simon Chan
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Simon Chan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
# @yume-chan/event
|
|
2
|
-
|
|
3
|
-
Provides a strongly-typed EventEmitter/Event implementation.
|
|
4
|
-
|
|
5
|
-
Inspired by TypeScript, Visual Studio Code, and more.
|
|
6
|
-
|
|
7
|
-
- [Disposable](#disposable)
|
|
8
|
-
- [AutoDisposable](#autodisposable)
|
|
9
|
-
- [DisposableList](#disposablelist)
|
|
10
|
-
- [EventEmitter/Event](#eventemitterevent)
|
|
11
|
-
|
|
12
|
-
## Disposable
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
interface Disposable {
|
|
16
|
-
dispose(): void;
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Represents anything that need cleanup before the garbage collector recycle it.
|
|
21
|
-
|
|
22
|
-
## AutoDisposable
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
class AutoDisposable implements Disposable {
|
|
26
|
-
private disposables;
|
|
27
|
-
constructor();
|
|
28
|
-
protected addDisposable<T extends Disposable>(disposable: T): T;
|
|
29
|
-
dispose(): void;
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
A base class for objects that need to manage multiple `Disposable`s.
|
|
34
|
-
|
|
35
|
-
Calling `dispose` on it will automatically dispose all `Disposable`s added via `addDisposable`.
|
|
36
|
-
|
|
37
|
-
Usually works like:
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
class MyObject extends AutoDisposable {
|
|
41
|
-
private event1 = this.addDisposable(new EventEmitter<void>());
|
|
42
|
-
|
|
43
|
-
private event2 = this.addDisposable(new EventEmitter<void>());
|
|
44
|
-
|
|
45
|
-
public dispose() {
|
|
46
|
-
// If the derived class has its own dispose logic
|
|
47
|
-
// Don't forget to call super's `dispose`
|
|
48
|
-
super.dispose();
|
|
49
|
-
|
|
50
|
-
// Clean up itself.
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## DisposableList
|
|
56
|
-
|
|
57
|
-
```ts
|
|
58
|
-
class DisposableList extends AutoDisposable {
|
|
59
|
-
add<T extends Disposable>(disposable: T): T;
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
An `AutoDisposable` that can be used alone (i.e. not as a base class).
|
|
64
|
-
|
|
65
|
-
## EventEmitter/Event
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
interface EventListener<TEvent, TThis, TArgs extends unknown[], TResult> {
|
|
69
|
-
(this: TThis, e: TEvent, ...args: TArgs): TResult;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
interface RemoveEventListener extends Disposable {
|
|
73
|
-
(): void;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
interface Event<TEvent, TResult = unknown> {
|
|
77
|
-
(listener: EventListener<TEvent, unknown, [], TResult>): RemoveEventListener;
|
|
78
|
-
<TThis, TArgs extends unknown[]>(listener: EventListener<TEvent, TThis, TArgs, TResult>, thisArg: TThis, ...args: TArgs): RemoveEventListener;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
class EventEmitter<TEvent, TResult = unknown> implements Disposable {
|
|
82
|
-
protected readonly listeners: EventListenerInfo<TEvent, TResult>[];
|
|
83
|
-
constructor();
|
|
84
|
-
protected addEventListener(info: EventListenerInfo<TEvent, TResult>): RemoveEventListener;
|
|
85
|
-
event: Event<TEvent, TResult>;
|
|
86
|
-
fire(e: TEvent): void;
|
|
87
|
-
dispose(): void;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
| | Node.js `EventEmitter` | This `EventEmitter` |
|
|
93
|
-
| ----------------------------------- | ---------------------- | ------------------- |
|
|
94
|
-
| Can emit multiple event types | Yes | No |
|
|
95
|
-
| Only trusted source can emit events | No | Yes |
|
|
96
|
-
| Strongly-typed | No | Yes |
|
|
97
|
-
|
|
98
|
-
One `EventEmitter` for one event type. So for classes that have multiple event types, multiple `EventEmitter` can be created and assigned to multiple fields.
|
|
99
|
-
|
|
100
|
-
Usually classes keep `EventEmitter`s private (using TypeScript's `private` modifier, or ECMAScript private field), only expose the `Event` interface (via `EventEmitter.event`).
|
|
101
|
-
|
|
102
|
-
Everyone can subscribe to the event using the `Event` interface, but the event can only be emitted from the `EventEmitter` class.
|
|
103
|
-
|
|
104
|
-
```ts
|
|
105
|
-
const emitter = new EventEmitter<void>();
|
|
106
|
-
const subscribe = emitter.event;
|
|
107
|
-
const unsubscribe = subscribe(() => {});
|
|
108
|
-
emitter.fire();
|
|
109
|
-
unsubscribe();
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
The returned `unsubscribe` is both a function and a `Disposable`, so it can be used with `AutoDisposable` or `DisposableList`.
|
|
1
|
+
# @yume-chan/event
|
|
2
|
+
|
|
3
|
+
Provides a strongly-typed EventEmitter/Event implementation.
|
|
4
|
+
|
|
5
|
+
Inspired by TypeScript, Visual Studio Code, and more.
|
|
6
|
+
|
|
7
|
+
- [Disposable](#disposable)
|
|
8
|
+
- [AutoDisposable](#autodisposable)
|
|
9
|
+
- [DisposableList](#disposablelist)
|
|
10
|
+
- [EventEmitter/Event](#eventemitterevent)
|
|
11
|
+
|
|
12
|
+
## Disposable
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
interface Disposable {
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Represents anything that need cleanup before the garbage collector recycle it.
|
|
21
|
+
|
|
22
|
+
## AutoDisposable
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
class AutoDisposable implements Disposable {
|
|
26
|
+
private disposables;
|
|
27
|
+
constructor();
|
|
28
|
+
protected addDisposable<T extends Disposable>(disposable: T): T;
|
|
29
|
+
dispose(): void;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
A base class for objects that need to manage multiple `Disposable`s.
|
|
34
|
+
|
|
35
|
+
Calling `dispose` on it will automatically dispose all `Disposable`s added via `addDisposable`.
|
|
36
|
+
|
|
37
|
+
Usually works like:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
class MyObject extends AutoDisposable {
|
|
41
|
+
private event1 = this.addDisposable(new EventEmitter<void>());
|
|
42
|
+
|
|
43
|
+
private event2 = this.addDisposable(new EventEmitter<void>());
|
|
44
|
+
|
|
45
|
+
public dispose() {
|
|
46
|
+
// If the derived class has its own dispose logic
|
|
47
|
+
// Don't forget to call super's `dispose`
|
|
48
|
+
super.dispose();
|
|
49
|
+
|
|
50
|
+
// Clean up itself.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## DisposableList
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
class DisposableList extends AutoDisposable {
|
|
59
|
+
add<T extends Disposable>(disposable: T): T;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
An `AutoDisposable` that can be used alone (i.e. not as a base class).
|
|
64
|
+
|
|
65
|
+
## EventEmitter/Event
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
interface EventListener<TEvent, TThis, TArgs extends unknown[], TResult> {
|
|
69
|
+
(this: TThis, e: TEvent, ...args: TArgs): TResult;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface RemoveEventListener extends Disposable {
|
|
73
|
+
(): void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface Event<TEvent, TResult = unknown> {
|
|
77
|
+
(listener: EventListener<TEvent, unknown, [], TResult>): RemoveEventListener;
|
|
78
|
+
<TThis, TArgs extends unknown[]>(listener: EventListener<TEvent, TThis, TArgs, TResult>, thisArg: TThis, ...args: TArgs): RemoveEventListener;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
class EventEmitter<TEvent, TResult = unknown> implements Disposable {
|
|
82
|
+
protected readonly listeners: EventListenerInfo<TEvent, TResult>[];
|
|
83
|
+
constructor();
|
|
84
|
+
protected addEventListener(info: EventListenerInfo<TEvent, TResult>): RemoveEventListener;
|
|
85
|
+
event: Event<TEvent, TResult>;
|
|
86
|
+
fire(e: TEvent): void;
|
|
87
|
+
dispose(): void;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
| | Node.js `EventEmitter` | This `EventEmitter` |
|
|
93
|
+
| ----------------------------------- | ---------------------- | ------------------- |
|
|
94
|
+
| Can emit multiple event types | Yes | No |
|
|
95
|
+
| Only trusted source can emit events | No | Yes |
|
|
96
|
+
| Strongly-typed | No | Yes |
|
|
97
|
+
|
|
98
|
+
One `EventEmitter` for one event type. So for classes that have multiple event types, multiple `EventEmitter` can be created and assigned to multiple fields.
|
|
99
|
+
|
|
100
|
+
Usually classes keep `EventEmitter`s private (using TypeScript's `private` modifier, or ECMAScript private field), only expose the `Event` interface (via `EventEmitter.event`).
|
|
101
|
+
|
|
102
|
+
Everyone can subscribe to the event using the `Event` interface, but the event can only be emitted from the `EventEmitter` class.
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
const emitter = new EventEmitter<void>();
|
|
106
|
+
const subscribe = emitter.event;
|
|
107
|
+
const unsubscribe = subscribe(() => {});
|
|
108
|
+
emitter.fire();
|
|
109
|
+
unsubscribe();
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The returned `unsubscribe` is both a function and a `Disposable`, so it can be used with `AutoDisposable` or `DisposableList`.
|
package/dts/event.d.ts
CHANGED
|
@@ -6,7 +6,13 @@ export interface RemoveEventListener extends Disposable {
|
|
|
6
6
|
(): void;
|
|
7
7
|
}
|
|
8
8
|
export interface Event<TEvent, TResult = unknown> {
|
|
9
|
+
/**
|
|
10
|
+
* Attaches an event listener.
|
|
11
|
+
*/
|
|
9
12
|
(listener: EventListener<TEvent, unknown, [], TResult>): RemoveEventListener;
|
|
13
|
+
/**
|
|
14
|
+
* Attaches an event listener that bind to `this` and `args`.
|
|
15
|
+
*/
|
|
10
16
|
<TThis, TArgs extends unknown[]>(listener: EventListener<TEvent, TThis, TArgs, TResult>, thisArg: TThis, ...args: TArgs): RemoveEventListener;
|
|
11
17
|
}
|
|
12
18
|
//# sourceMappingURL=event.d.ts.map
|
package/dts/event.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO;IAC1E,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;CACrD;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACnD,IAAI,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAC5C,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC;IAE7E,CAAC,KAAK,EAAE,KAAK,SAAS,OAAO,EAAE,EAC3B,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EACtD,OAAO,EAAE,KAAK,EACd,GAAG,IAAI,EAAE,KAAK,GACf,mBAAmB,CAAC;CAC1B"}
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO;IAC1E,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;CACrD;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACnD,IAAI,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO;IAC5C;;OAEG;IACH,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAAC;IAE7E;;OAEG;IACH,CAAC,KAAK,EAAE,KAAK,SAAS,OAAO,EAAE,EAC3B,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EACtD,OAAO,EAAE,KAAK,EACd,GAAG,IAAI,EAAE,KAAK,GACf,mBAAmB,CAAC;CAC1B"}
|
package/dts/index.d.ts
CHANGED
package/dts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
|
package/dts/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wBAAsB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMzD"}
|
package/esm/disposable.js
CHANGED
|
@@ -1,42 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function AutoDisposable() {
|
|
1
|
+
export class AutoDisposable {
|
|
2
|
+
constructor() {
|
|
4
3
|
this.disposables = [];
|
|
5
4
|
this.dispose = this.dispose.bind(this);
|
|
6
5
|
}
|
|
7
|
-
|
|
6
|
+
addDisposable(disposable) {
|
|
8
7
|
this.disposables.push(disposable);
|
|
9
8
|
return disposable;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (var _b = __values(this.disposables), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
15
|
-
var disposable = _c.value;
|
|
16
|
-
disposable.dispose();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
20
|
-
finally {
|
|
21
|
-
try {
|
|
22
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
23
|
-
}
|
|
24
|
-
finally { if (e_1) throw e_1.error; }
|
|
9
|
+
}
|
|
10
|
+
dispose() {
|
|
11
|
+
for (const disposable of this.disposables) {
|
|
12
|
+
disposable.dispose();
|
|
25
13
|
}
|
|
26
14
|
this.disposables = [];
|
|
27
|
-
};
|
|
28
|
-
return AutoDisposable;
|
|
29
|
-
}());
|
|
30
|
-
export { AutoDisposable };
|
|
31
|
-
var DisposableList = /** @class */ (function (_super) {
|
|
32
|
-
__extends(DisposableList, _super);
|
|
33
|
-
function DisposableList() {
|
|
34
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
35
15
|
}
|
|
36
|
-
|
|
16
|
+
}
|
|
17
|
+
export class DisposableList extends AutoDisposable {
|
|
18
|
+
add(disposable) {
|
|
37
19
|
return this.addDisposable(disposable);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
}(AutoDisposable));
|
|
41
|
-
export { DisposableList };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
42
22
|
//# sourceMappingURL=disposable.js.map
|
package/esm/disposable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disposable.js","sourceRoot":"","sources":["../src/disposable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"disposable.js","sourceRoot":"","sources":["../src/disposable.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,cAAc;IAGvB;QAFQ,gBAAW,GAAiB,EAAE,CAAC;QAGnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAES,aAAa,CAAuB,UAAa;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,OAAO;QACV,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE;YACvC,UAAU,CAAC,OAAO,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;CACJ;AAED,MAAM,OAAO,cAAe,SAAQ,cAAc;IACvC,GAAG,CAAuB,UAAa;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;CACJ"}
|
package/esm/event-emitter.js
CHANGED
|
@@ -1,53 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function EventEmitter() {
|
|
1
|
+
export class EventEmitter {
|
|
2
|
+
constructor() {
|
|
4
3
|
this.listeners = [];
|
|
5
4
|
this.event = this.event.bind(this);
|
|
6
5
|
}
|
|
7
|
-
|
|
8
|
-
var _this = this;
|
|
6
|
+
addEventListener(info) {
|
|
9
7
|
this.listeners.push(info);
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const remove = () => {
|
|
9
|
+
const index = this.listeners.indexOf(info);
|
|
12
10
|
if (index !== -1) {
|
|
13
|
-
|
|
11
|
+
this.listeners.splice(index, 1);
|
|
14
12
|
}
|
|
15
13
|
};
|
|
16
14
|
remove.dispose = remove;
|
|
17
15
|
return remove;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
var info = {
|
|
25
|
-
listener: listener,
|
|
26
|
-
thisArg: thisArg,
|
|
27
|
-
args: args,
|
|
16
|
+
}
|
|
17
|
+
event(listener, thisArg, ...args) {
|
|
18
|
+
const info = {
|
|
19
|
+
listener,
|
|
20
|
+
thisArg,
|
|
21
|
+
args,
|
|
28
22
|
};
|
|
29
23
|
return this.addEventListener(info);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for (var _b = __values(this.listeners.slice()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
35
|
-
var info = _c.value;
|
|
36
|
-
info.listener.apply(info.thisArg, __spread([e], info.args));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
40
|
-
finally {
|
|
41
|
-
try {
|
|
42
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
43
|
-
}
|
|
44
|
-
finally { if (e_1) throw e_1.error; }
|
|
24
|
+
}
|
|
25
|
+
fire(e) {
|
|
26
|
+
for (const info of this.listeners.slice()) {
|
|
27
|
+
info.listener.apply(info.thisArg, [e, ...info.args]);
|
|
45
28
|
}
|
|
46
|
-
}
|
|
47
|
-
|
|
29
|
+
}
|
|
30
|
+
dispose() {
|
|
48
31
|
this.listeners.length = 0;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
}());
|
|
52
|
-
export { EventEmitter };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
53
34
|
//# sourceMappingURL=event-emitter.js.map
|
package/esm/event-emitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../src/event-emitter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../src/event-emitter.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,YAAY;IAGrB;QAFmB,cAAS,GAAyC,EAAE,CAAC;QAGpE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAES,gBAAgB,CAAC,IAAwC;QAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAwB,GAAG,EAAE;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC;IAUM,KAAK,CACR,QAAsD,EACtD,OAAe,EACf,GAAG,IAAW;QAEd,MAAM,IAAI,GAAuC;YAC7C,QAAQ;YACR,OAAO;YACP,IAAI;SACP,CAAC;QACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,IAAI,CAAC,CAAS;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SACxD;IACL,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;CACJ"}
|
package/esm/index.js
CHANGED
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
|
package/esm/utils.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { PromiseResolver } from '@yume-chan/async';
|
|
3
|
+
export function once(event) {
|
|
4
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
5
|
+
const resolver = new PromiseResolver();
|
|
6
|
+
const dispose = event(resolver.resolve);
|
|
7
|
+
const result = yield resolver.promise;
|
|
8
|
+
dispose();
|
|
9
|
+
return result;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=utils.js.map
|
package/esm/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,UAAgB,IAAI,CAAI,KAAe;;QACzC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,CAAC;QACV,OAAO,MAAM,CAAC;IAClB,CAAC;CAAA"}
|
package/package.json
CHANGED
|
@@ -1,49 +1,43 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@yume-chan/event",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Event/EventEmitter",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"event",
|
|
7
|
-
"eventemitter",
|
|
8
|
-
"typescript"
|
|
9
|
-
],
|
|
10
|
-
"license": "MIT",
|
|
11
|
-
"author": {
|
|
12
|
-
"name": "Simon Chan",
|
|
13
|
-
"email": "cnsimonchan@live.com",
|
|
14
|
-
"url": "https://chensi.moe/blog"
|
|
15
|
-
},
|
|
16
|
-
"homepage": "https://github.com/yume-chan/ya-webadb/tree/master/
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/yume-chan/ya-webadb.git",
|
|
20
|
-
"directory": "
|
|
21
|
-
},
|
|
22
|
-
"bugs": {
|
|
23
|
-
"url": "https://github.com/yume-chan/ya-webadb/issues"
|
|
24
|
-
},
|
|
25
|
-
"
|
|
26
|
-
"module": "esm/index.js",
|
|
27
|
-
"types": "dts/index.d.ts",
|
|
28
|
-
"scripts": {
|
|
29
|
-
"build": "
|
|
30
|
-
"build:watch": "
|
|
31
|
-
"test": "jest",
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"tslib": "2.1
|
|
37
|
-
},
|
|
38
|
-
"devDependencies": {
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
"publishConfig": {
|
|
46
|
-
"access": "public"
|
|
47
|
-
},
|
|
48
|
-
"gitHead": "90a1b1b331b6fc9ff24f9b54667879393450d27e"
|
|
49
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@yume-chan/event",
|
|
3
|
+
"version": "0.0.10",
|
|
4
|
+
"description": "Event/EventEmitter",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"event",
|
|
7
|
+
"eventemitter",
|
|
8
|
+
"typescript"
|
|
9
|
+
],
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": {
|
|
12
|
+
"name": "Simon Chan",
|
|
13
|
+
"email": "cnsimonchan@live.com",
|
|
14
|
+
"url": "https://chensi.moe/blog"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/yume-chan/ya-webadb/tree/master/libraries/event#readme",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/yume-chan/ya-webadb.git",
|
|
20
|
+
"directory": "libraries/event"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/yume-chan/ya-webadb/issues"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"module": "esm/index.js",
|
|
27
|
+
"types": "dts/index.d.ts",
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "build-ts-package",
|
|
30
|
+
"build:watch": "build-ts-package --incremental",
|
|
31
|
+
"test": "jest --coverage",
|
|
32
|
+
"prepublishOnly": "npm run build"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@yume-chan/async": "^2.1.4",
|
|
36
|
+
"tslib": "^2.3.1"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"jest": "^26.6.3",
|
|
40
|
+
"typescript": "^4.5.4",
|
|
41
|
+
"@yume-chan/ts-package-builder": "^1.0.0"
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/disposable.ts
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
export interface Disposable {
|
|
2
|
-
dispose(): void;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export class AutoDisposable implements Disposable {
|
|
6
|
-
private disposables: Disposable[] = [];
|
|
7
|
-
|
|
8
|
-
public constructor() {
|
|
9
|
-
this.dispose = this.dispose.bind(this);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
protected addDisposable<T extends Disposable>(disposable: T): T {
|
|
13
|
-
this.disposables.push(disposable);
|
|
14
|
-
return disposable;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public dispose() {
|
|
18
|
-
for (const disposable of this.disposables) {
|
|
19
|
-
disposable.dispose();
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
this.disposables = [];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class DisposableList extends AutoDisposable {
|
|
27
|
-
public add<T extends Disposable>(disposable: T): T {
|
|
28
|
-
return this.addDisposable(disposable);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
export interface Disposable {
|
|
2
|
+
dispose(): void;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export class AutoDisposable implements Disposable {
|
|
6
|
+
private disposables: Disposable[] = [];
|
|
7
|
+
|
|
8
|
+
public constructor() {
|
|
9
|
+
this.dispose = this.dispose.bind(this);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
protected addDisposable<T extends Disposable>(disposable: T): T {
|
|
13
|
+
this.disposables.push(disposable);
|
|
14
|
+
return disposable;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public dispose() {
|
|
18
|
+
for (const disposable of this.disposables) {
|
|
19
|
+
disposable.dispose();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
this.disposables = [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class DisposableList extends AutoDisposable {
|
|
27
|
+
public add<T extends Disposable>(disposable: T): T {
|
|
28
|
+
return this.addDisposable(disposable);
|
|
29
|
+
}
|
|
30
|
+
}
|
package/src/event-emitter.ts
CHANGED
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import { Disposable } from './disposable';
|
|
2
|
-
import { EventListener, RemoveEventListener } from './event';
|
|
3
|
-
|
|
4
|
-
export interface EventListenerInfo<TEvent, TResult = unknown> {
|
|
5
|
-
listener: EventListener<TEvent, any, any, TResult>;
|
|
6
|
-
|
|
7
|
-
thisArg: unknown;
|
|
8
|
-
|
|
9
|
-
args: unknown[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export class EventEmitter<TEvent, TResult = unknown> implements Disposable {
|
|
13
|
-
protected readonly listeners: EventListenerInfo<TEvent, TResult>[] = [];
|
|
14
|
-
|
|
15
|
-
public constructor() {
|
|
16
|
-
this.event = this.event.bind(this);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
protected addEventListener(info: EventListenerInfo<TEvent, TResult>): RemoveEventListener {
|
|
20
|
-
this.listeners.push(info);
|
|
21
|
-
|
|
22
|
-
const remove: RemoveEventListener = () => {
|
|
23
|
-
const index = this.listeners.indexOf(info);
|
|
24
|
-
if (index !== -1) {
|
|
25
|
-
this.listeners.splice(index, 1);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
remove.dispose = remove;
|
|
29
|
-
return remove;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public event(
|
|
33
|
-
listener: EventListener<TEvent, unknown, [], TResult>
|
|
34
|
-
): RemoveEventListener;
|
|
35
|
-
public event<TThis, TArgs extends unknown[]>(
|
|
36
|
-
listener: EventListener<TEvent, TThis, TArgs, TResult>,
|
|
37
|
-
thisArg: TThis,
|
|
38
|
-
...args: TArgs
|
|
39
|
-
): RemoveEventListener;
|
|
40
|
-
public event<TThis, TArgs extends unknown[]>(
|
|
41
|
-
listener: EventListener<TEvent, TThis, TArgs, TResult>,
|
|
42
|
-
thisArg?: TThis,
|
|
43
|
-
...args: TArgs
|
|
44
|
-
): RemoveEventListener {
|
|
45
|
-
const info: EventListenerInfo<TEvent, TResult> = {
|
|
46
|
-
listener,
|
|
47
|
-
thisArg,
|
|
48
|
-
args,
|
|
49
|
-
};
|
|
50
|
-
return this.addEventListener(info);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public fire(e: TEvent) {
|
|
54
|
-
for (const info of this.listeners.slice()) {
|
|
55
|
-
info.listener.apply(info.thisArg, [e, ...info.args]);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
public dispose() {
|
|
60
|
-
this.listeners.length = 0;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
1
|
+
import { Disposable } from './disposable';
|
|
2
|
+
import { EventListener, RemoveEventListener } from './event';
|
|
3
|
+
|
|
4
|
+
export interface EventListenerInfo<TEvent, TResult = unknown> {
|
|
5
|
+
listener: EventListener<TEvent, any, any, TResult>;
|
|
6
|
+
|
|
7
|
+
thisArg: unknown;
|
|
8
|
+
|
|
9
|
+
args: unknown[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class EventEmitter<TEvent, TResult = unknown> implements Disposable {
|
|
13
|
+
protected readonly listeners: EventListenerInfo<TEvent, TResult>[] = [];
|
|
14
|
+
|
|
15
|
+
public constructor() {
|
|
16
|
+
this.event = this.event.bind(this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected addEventListener(info: EventListenerInfo<TEvent, TResult>): RemoveEventListener {
|
|
20
|
+
this.listeners.push(info);
|
|
21
|
+
|
|
22
|
+
const remove: RemoveEventListener = () => {
|
|
23
|
+
const index = this.listeners.indexOf(info);
|
|
24
|
+
if (index !== -1) {
|
|
25
|
+
this.listeners.splice(index, 1);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
remove.dispose = remove;
|
|
29
|
+
return remove;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public event(
|
|
33
|
+
listener: EventListener<TEvent, unknown, [], TResult>
|
|
34
|
+
): RemoveEventListener;
|
|
35
|
+
public event<TThis, TArgs extends unknown[]>(
|
|
36
|
+
listener: EventListener<TEvent, TThis, TArgs, TResult>,
|
|
37
|
+
thisArg: TThis,
|
|
38
|
+
...args: TArgs
|
|
39
|
+
): RemoveEventListener;
|
|
40
|
+
public event<TThis, TArgs extends unknown[]>(
|
|
41
|
+
listener: EventListener<TEvent, TThis, TArgs, TResult>,
|
|
42
|
+
thisArg?: TThis,
|
|
43
|
+
...args: TArgs
|
|
44
|
+
): RemoveEventListener {
|
|
45
|
+
const info: EventListenerInfo<TEvent, TResult> = {
|
|
46
|
+
listener,
|
|
47
|
+
thisArg,
|
|
48
|
+
args,
|
|
49
|
+
};
|
|
50
|
+
return this.addEventListener(info);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public fire(e: TEvent) {
|
|
54
|
+
for (const info of this.listeners.slice()) {
|
|
55
|
+
info.listener.apply(info.thisArg, [e, ...info.args]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public dispose() {
|
|
60
|
+
this.listeners.length = 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/event.ts
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
import { Disposable } from './disposable';
|
|
2
|
-
|
|
3
|
-
export interface EventListener<TEvent, TThis, TArgs extends unknown[], TResult> {
|
|
4
|
-
(this: TThis, e: TEvent, ...args: TArgs): TResult;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export interface RemoveEventListener extends Disposable {
|
|
8
|
-
(): void;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface Event<TEvent, TResult = unknown> {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { Disposable } from './disposable';
|
|
2
|
+
|
|
3
|
+
export interface EventListener<TEvent, TThis, TArgs extends unknown[], TResult> {
|
|
4
|
+
(this: TThis, e: TEvent, ...args: TArgs): TResult;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface RemoveEventListener extends Disposable {
|
|
8
|
+
(): void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface Event<TEvent, TResult = unknown> {
|
|
12
|
+
/**
|
|
13
|
+
* Attaches an event listener.
|
|
14
|
+
*/
|
|
15
|
+
(listener: EventListener<TEvent, unknown, [], TResult>): RemoveEventListener;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Attaches an event listener that bind to `this` and `args`.
|
|
19
|
+
*/
|
|
20
|
+
<TThis, TArgs extends unknown[]>(
|
|
21
|
+
listener: EventListener<TEvent, TThis, TArgs, TResult>,
|
|
22
|
+
thisArg: TThis,
|
|
23
|
+
...args: TArgs
|
|
24
|
+
): RemoveEventListener;
|
|
25
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export * from './disposable';
|
|
2
|
-
export * from './event';
|
|
3
|
-
export * from './event-emitter';
|
|
1
|
+
export * from './disposable';
|
|
2
|
+
export * from './event';
|
|
3
|
+
export * from './event-emitter';
|
|
4
|
+
export * from './utils';
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PromiseResolver } from '@yume-chan/async';
|
|
2
|
+
import { Event } from './event';
|
|
3
|
+
|
|
4
|
+
export async function once<T>(event: Event<T>): Promise<T> {
|
|
5
|
+
const resolver = new PromiseResolver<T>();
|
|
6
|
+
const dispose = event(resolver.resolve);
|
|
7
|
+
const result = await resolver.promise;
|
|
8
|
+
dispose();
|
|
9
|
+
return result;
|
|
10
|
+
}
|
package/cjs/disposable.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DisposableList = exports.AutoDisposable = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var AutoDisposable = /** @class */ (function () {
|
|
6
|
-
function AutoDisposable() {
|
|
7
|
-
this.disposables = [];
|
|
8
|
-
this.dispose = this.dispose.bind(this);
|
|
9
|
-
}
|
|
10
|
-
AutoDisposable.prototype.addDisposable = function (disposable) {
|
|
11
|
-
this.disposables.push(disposable);
|
|
12
|
-
return disposable;
|
|
13
|
-
};
|
|
14
|
-
AutoDisposable.prototype.dispose = function () {
|
|
15
|
-
var e_1, _a;
|
|
16
|
-
try {
|
|
17
|
-
for (var _b = tslib_1.__values(this.disposables), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
18
|
-
var disposable = _c.value;
|
|
19
|
-
disposable.dispose();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
23
|
-
finally {
|
|
24
|
-
try {
|
|
25
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
26
|
-
}
|
|
27
|
-
finally { if (e_1) throw e_1.error; }
|
|
28
|
-
}
|
|
29
|
-
this.disposables = [];
|
|
30
|
-
};
|
|
31
|
-
return AutoDisposable;
|
|
32
|
-
}());
|
|
33
|
-
exports.AutoDisposable = AutoDisposable;
|
|
34
|
-
var DisposableList = /** @class */ (function (_super) {
|
|
35
|
-
tslib_1.__extends(DisposableList, _super);
|
|
36
|
-
function DisposableList() {
|
|
37
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
38
|
-
}
|
|
39
|
-
DisposableList.prototype.add = function (disposable) {
|
|
40
|
-
return this.addDisposable(disposable);
|
|
41
|
-
};
|
|
42
|
-
return DisposableList;
|
|
43
|
-
}(AutoDisposable));
|
|
44
|
-
exports.DisposableList = DisposableList;
|
|
45
|
-
//# sourceMappingURL=disposable.js.map
|
package/cjs/disposable.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"disposable.js","sourceRoot":"","sources":["../src/disposable.ts"],"names":[],"mappings":";;;;AAIA;IAGI;QAFQ,gBAAW,GAAiB,EAAE,CAAC;QAGnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAES,sCAAa,GAAvB,UAA8C,UAAa;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,gCAAO,GAAd;;;YACI,KAAyB,IAAA,KAAA,iBAAA,IAAI,CAAC,WAAW,CAAA,gBAAA,4BAAE;gBAAtC,IAAM,UAAU,WAAA;gBACjB,UAAU,CAAC,OAAO,EAAE,CAAC;aACxB;;;;;;;;;QAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IACL,qBAAC;AAAD,CAAC,AAnBD,IAmBC;AAnBY,wCAAc;AAqB3B;IAAoC,0CAAc;IAAlD;;IAIA,CAAC;IAHU,4BAAG,GAAV,UAAiC,UAAa;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IACL,qBAAC;AAAD,CAAC,AAJD,CAAoC,cAAc,GAIjD;AAJY,wCAAc"}
|
package/cjs/event-emitter.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EventEmitter = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var EventEmitter = /** @class */ (function () {
|
|
6
|
-
function EventEmitter() {
|
|
7
|
-
this.listeners = [];
|
|
8
|
-
this.event = this.event.bind(this);
|
|
9
|
-
}
|
|
10
|
-
EventEmitter.prototype.addEventListener = function (info) {
|
|
11
|
-
var _this = this;
|
|
12
|
-
this.listeners.push(info);
|
|
13
|
-
var remove = function () {
|
|
14
|
-
var index = _this.listeners.indexOf(info);
|
|
15
|
-
if (index !== -1) {
|
|
16
|
-
_this.listeners.splice(index, 1);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
remove.dispose = remove;
|
|
20
|
-
return remove;
|
|
21
|
-
};
|
|
22
|
-
EventEmitter.prototype.event = function (listener, thisArg) {
|
|
23
|
-
var args = [];
|
|
24
|
-
for (var _i = 2; _i < arguments.length; _i++) {
|
|
25
|
-
args[_i - 2] = arguments[_i];
|
|
26
|
-
}
|
|
27
|
-
var info = {
|
|
28
|
-
listener: listener,
|
|
29
|
-
thisArg: thisArg,
|
|
30
|
-
args: args,
|
|
31
|
-
};
|
|
32
|
-
return this.addEventListener(info);
|
|
33
|
-
};
|
|
34
|
-
EventEmitter.prototype.fire = function (e) {
|
|
35
|
-
var e_1, _a;
|
|
36
|
-
try {
|
|
37
|
-
for (var _b = tslib_1.__values(this.listeners.slice()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
38
|
-
var info = _c.value;
|
|
39
|
-
info.listener.apply(info.thisArg, tslib_1.__spread([e], info.args));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
43
|
-
finally {
|
|
44
|
-
try {
|
|
45
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
46
|
-
}
|
|
47
|
-
finally { if (e_1) throw e_1.error; }
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
EventEmitter.prototype.dispose = function () {
|
|
51
|
-
this.listeners.length = 0;
|
|
52
|
-
};
|
|
53
|
-
return EventEmitter;
|
|
54
|
-
}());
|
|
55
|
-
exports.EventEmitter = EventEmitter;
|
|
56
|
-
//# sourceMappingURL=event-emitter.js.map
|
package/cjs/event-emitter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../src/event-emitter.ts"],"names":[],"mappings":";;;;AAWA;IAGI;QAFmB,cAAS,GAAyC,EAAE,CAAC;QAGpE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAES,uCAAgB,GAA1B,UAA2B,IAAwC;QAAnE,iBAWC;QAVG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAM,MAAM,GAAwB;YAChC,IAAM,KAAK,GAAG,KAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBACd,KAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QACF,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC;IAClB,CAAC;IAUM,4BAAK,GAAZ,UACI,QAAsD,EACtD,OAAe;QACf,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,6BAAc;;QAEd,IAAM,IAAI,GAAuC;YAC7C,QAAQ,UAAA;YACR,OAAO,SAAA;YACP,IAAI,MAAA;SACP,CAAC;QACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,2BAAI,GAAX,UAAY,CAAS;;;YACjB,KAAmB,IAAA,KAAA,iBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA,gBAAA,4BAAE;gBAAtC,IAAM,IAAI,WAAA;gBACX,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,oBAAG,CAAC,GAAK,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD;;;;;;;;;IACL,CAAC;IAEM,8BAAO,GAAd;QACI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IACL,mBAAC;AAAD,CAAC,AAlDD,IAkDC;AAlDY,oCAAY"}
|
package/cjs/event.js
DELETED
package/cjs/event.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":""}
|
package/cjs/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var tslib_1 = require("tslib");
|
|
4
|
-
tslib_1.__exportStar(require("./disposable"), exports);
|
|
5
|
-
tslib_1.__exportStar(require("./event"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./event-emitter"), exports);
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,kDAAwB;AACxB,0DAAgC"}
|
package/tsconfig.cjs.json
DELETED
package/tsconfig.esm.json
DELETED