evg_observable 1.0.7 → 1.0.11
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/README.md +145 -1
- package/package.json +13 -3
- package/src/outLib/Observables/Observable.d.ts +3 -0
- package/src/outLib/Observables/Observable.js +16 -0
- package/src/outLib/Observables/Observable.js.map +1 -1
- package/src/Libraries/FunctionLibs.ts +0 -9
- package/src/Libraries/Observables/Collector.ts +0 -44
- package/src/Libraries/Observables/Observable.ts +0 -206
- package/src/Libraries/Observables/OrderedObservable.ts +0 -86
- package/src/Libraries/Observables/Types.ts +0 -159
- package/src/Libraries/TickGenerator.ts +0 -178
- package/src/Libraries/Types.ts +0 -27
- package/test/Collector.unit.test.ts +0 -244
- package/test/FunctionLib.unit.test.ts +0 -86
- package/test/OrderedObservable.unit.test.ts +0 -826
- package/test/observable.unit.test.ts +0 -681
- package/test/tsconfig.json +0 -21
package/README.md
CHANGED
|
@@ -1 +1,145 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align=center style="color: saddlebrown">
|
|
2
|
+
EVG Observable
|
|
3
|
+
</h1>
|
|
4
|
+
<p align=center>
|
|
5
|
+
EVG Observable - is a light library for simple use.
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
## What is EVG Observable?
|
|
9
|
+
|
|
10
|
+
EVG Observable - is a small library for serving asynchronous events.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
### Node.js
|
|
15
|
+
|
|
16
|
+
`EVG Observable` is available on [npm](http://npmjs.org). To install it, type:
|
|
17
|
+
|
|
18
|
+
$ npm install evg_observable
|
|
19
|
+
|
|
20
|
+
# Usage
|
|
21
|
+
(tsconfig.json {"strict": false})
|
|
22
|
+
|
|
23
|
+
## Observable simple usage
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import {Observable} from "evg_observable/src/outLib/Observables/Observable";
|
|
27
|
+
|
|
28
|
+
const observable$ = new Observable('Some typed data (not only string)');
|
|
29
|
+
const listener1 = (value: string) => console.log('listener1:',value);
|
|
30
|
+
const listener2 = (value: string) => console.log('listener2:',value);
|
|
31
|
+
const subscriber1 = observable$.subscribe(listener1);
|
|
32
|
+
const subscriber2 = observable$.subscribe(listener2);
|
|
33
|
+
|
|
34
|
+
console.log(observable$.getValue());
|
|
35
|
+
// Print to console - Some typed data (not only string)
|
|
36
|
+
|
|
37
|
+
observable$.next('Next typed data')
|
|
38
|
+
// Print to console - listener1: Next typed data
|
|
39
|
+
// Print to console - listener2: Next typed data
|
|
40
|
+
|
|
41
|
+
// if subscribers are not needed
|
|
42
|
+
subscriber1.unsubscribe();
|
|
43
|
+
subscriber2.unsubscribe();
|
|
44
|
+
|
|
45
|
+
// if a observable$ is not needed
|
|
46
|
+
observable$.destroy(); // all subscribers have automatically unsubscribed
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Observable pipe usage
|
|
50
|
+
### pipe().setOnce()
|
|
51
|
+
|
|
52
|
+
Observable will send a value to the subscriber only once, and the subscriber will unsubscribe.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import {Observable} from "evg_observable/src/outLib/Observables/Observable";
|
|
56
|
+
|
|
57
|
+
const observable$ = new Observable('Some typed data (not only string)');
|
|
58
|
+
const listener1 = (value: string) => console.log('listener1:',value);
|
|
59
|
+
const listener2 = (value: string) => console.log('listener2:',value);
|
|
60
|
+
|
|
61
|
+
const subscriber1 = observable$
|
|
62
|
+
.pipe()
|
|
63
|
+
.setOnce()
|
|
64
|
+
.subscribe(listener1);
|
|
65
|
+
const subscriber2 = observable$.subscribe(listener2);
|
|
66
|
+
|
|
67
|
+
console.log(observable$.getValue());
|
|
68
|
+
// Print to console - Some typed data (not only string)
|
|
69
|
+
|
|
70
|
+
observable$.next('Next1 typed data')
|
|
71
|
+
// Print to console - listener1: Next1 typed data
|
|
72
|
+
// Print to console - listener2: Next1 typed data
|
|
73
|
+
|
|
74
|
+
observable$.next('Next2 typed data')
|
|
75
|
+
// Print to console - listener2: Next2 typed data
|
|
76
|
+
|
|
77
|
+
// subscriber1 is automatically unsubscribed after first usage
|
|
78
|
+
```
|
|
79
|
+
### pipe().unsubscribeByNegative(condition)
|
|
80
|
+
|
|
81
|
+
Observable will send a value to the subscriber as long as the condition is positive, on the first negative result, the subscriber will unsubscribe.
|
|
82
|
+
```ts
|
|
83
|
+
import {Observable} from "evg_observable/src/outLib/Observables/Observable";
|
|
84
|
+
|
|
85
|
+
const observable$ = new Observable('Some typed data (not only string)');
|
|
86
|
+
const listener1 = (value: string) => console.log('listener1:', value);
|
|
87
|
+
const listener2 = (value: string) => console.log('listener2:', value);
|
|
88
|
+
let isPositive = true;
|
|
89
|
+
|
|
90
|
+
const subscriber1 = observable$
|
|
91
|
+
.pipe()
|
|
92
|
+
.unsubscribeByNegative(() => isPositive)
|
|
93
|
+
.subscribe(listener1);
|
|
94
|
+
const subscriber2 = observable$.subscribe(listener2);
|
|
95
|
+
|
|
96
|
+
console.log(observable$.getValue());
|
|
97
|
+
// Print to console - Some typed data (not only string)
|
|
98
|
+
|
|
99
|
+
observable$.next('Next1 typed data')
|
|
100
|
+
// Print to console - listener1: Next1 typed data
|
|
101
|
+
// Print to console - listener2: Next1 typed data
|
|
102
|
+
|
|
103
|
+
observable$.next('Next2 typed data')
|
|
104
|
+
// Print to console - listener1: Next2 typed data
|
|
105
|
+
// Print to console - listener2: Next2 typed data
|
|
106
|
+
|
|
107
|
+
isPositive = false;
|
|
108
|
+
observable$.next('Next3 typed data')
|
|
109
|
+
// Print to console - listener2: Next3 typed data
|
|
110
|
+
|
|
111
|
+
// subscriber1 is automatically unsubscribed when negative condition
|
|
112
|
+
```
|
|
113
|
+
### pipe().unsubscribeByPositive(condition)
|
|
114
|
+
Observable will send a value to the subscriber as long as the condition is negative, on the first positive result, the subscriber will unsubscribe.
|
|
115
|
+
```ts
|
|
116
|
+
import {Observable} from "evg_observable/src/outLib/Observables/Observable";
|
|
117
|
+
|
|
118
|
+
const observable$ = new Observable('Some typed data (not only string)');
|
|
119
|
+
const listener1 = (value: string) => console.log('listener1:', value);
|
|
120
|
+
const listener2 = (value: string) => console.log('listener2:', value);
|
|
121
|
+
let isPositive = false;
|
|
122
|
+
|
|
123
|
+
const subscriber1 = observable$
|
|
124
|
+
.pipe()
|
|
125
|
+
.unsubscribeByPositive(() => isPositive)
|
|
126
|
+
.subscribe(listener1);
|
|
127
|
+
const subscriber2 = observable$.subscribe(listener2);
|
|
128
|
+
|
|
129
|
+
console.log(observable$.getValue());
|
|
130
|
+
// Print to console - Some typed data (not only string)
|
|
131
|
+
|
|
132
|
+
observable$.next('Next1 typed data')
|
|
133
|
+
// Print to console - listener1: Next1 typed data
|
|
134
|
+
// Print to console - listener2: Next1 typed data
|
|
135
|
+
|
|
136
|
+
observable$.next('Next2 typed data')
|
|
137
|
+
// Print to console - listener1: Next2 typed data
|
|
138
|
+
// Print to console - listener2: Next2 typed data
|
|
139
|
+
|
|
140
|
+
isPositive = true;
|
|
141
|
+
observable$.next('Next3 typed data')
|
|
142
|
+
// Print to console - listener2: Next3 typed data
|
|
143
|
+
|
|
144
|
+
// subscriber1 is automatically unsubscribed when positive condition
|
|
145
|
+
```
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evg_observable",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.11",
|
|
4
|
+
"description": "Light observable",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"directories": {
|
|
7
7
|
"test": "test"
|
|
@@ -28,5 +28,15 @@
|
|
|
28
28
|
"mocha": "^9.1.1",
|
|
29
29
|
"nyc": "^15.1.0",
|
|
30
30
|
"ts-node": "^10.2.1"
|
|
31
|
-
}
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"Observable",
|
|
34
|
+
"Light observable",
|
|
35
|
+
"Type script",
|
|
36
|
+
"TypeScript",
|
|
37
|
+
"TS",
|
|
38
|
+
"Java script",
|
|
39
|
+
"JavaScript",
|
|
40
|
+
"JS"
|
|
41
|
+
]
|
|
32
42
|
}
|
|
@@ -30,11 +30,14 @@ export declare class Observable<T> implements IObserver<T> {
|
|
|
30
30
|
protected listeners: ISubscribeObject<T>[];
|
|
31
31
|
private _isEnable;
|
|
32
32
|
protected _isDestroyed: boolean;
|
|
33
|
+
private isNextProcess;
|
|
34
|
+
private listenersForUnsubscribe;
|
|
33
35
|
constructor(value: T);
|
|
34
36
|
disable(): void;
|
|
35
37
|
enable(): void;
|
|
36
38
|
get isEnable(): boolean;
|
|
37
39
|
next(value: T): void;
|
|
40
|
+
private handleListenersForUnsubscribe;
|
|
38
41
|
unSubscribe(listener: ISubscriptionLike<T>): void;
|
|
39
42
|
destroy(): void;
|
|
40
43
|
unsubscribeAll(): void;
|
|
@@ -117,6 +117,8 @@ var Observable = /** @class */ (function () {
|
|
|
117
117
|
this.listeners = [];
|
|
118
118
|
this._isEnable = true;
|
|
119
119
|
this._isDestroyed = false;
|
|
120
|
+
this.isNextProcess = false;
|
|
121
|
+
this.listenersForUnsubscribe = [];
|
|
120
122
|
}
|
|
121
123
|
Observable.prototype.disable = function () {
|
|
122
124
|
this._isEnable = false;
|
|
@@ -137,12 +139,26 @@ var Observable = /** @class */ (function () {
|
|
|
137
139
|
if (!this._isEnable)
|
|
138
140
|
return;
|
|
139
141
|
this.value = value;
|
|
142
|
+
this.isNextProcess = true;
|
|
140
143
|
for (var i = 0; i < this.listeners.length; i++)
|
|
141
144
|
this.listeners[i].send(value);
|
|
145
|
+
this.isNextProcess = false;
|
|
146
|
+
this.handleListenersForUnsubscribe();
|
|
147
|
+
};
|
|
148
|
+
Observable.prototype.handleListenersForUnsubscribe = function () {
|
|
149
|
+
for (var _i = 0, _a = this.listenersForUnsubscribe; _i < _a.length; _i++) {
|
|
150
|
+
var listener = _a[_i];
|
|
151
|
+
this.unSubscribe(listener);
|
|
152
|
+
}
|
|
153
|
+
this.listenersForUnsubscribe.length = 0;
|
|
142
154
|
};
|
|
143
155
|
Observable.prototype.unSubscribe = function (listener) {
|
|
144
156
|
if (this._isDestroyed)
|
|
145
157
|
return;
|
|
158
|
+
if (this.isNextProcess) {
|
|
159
|
+
this.listenersForUnsubscribe.push(listener);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
146
162
|
this.listeners &&
|
|
147
163
|
!(0, FunctionLibs_1.deleteFromArray)(this.listeners, listener);
|
|
148
164
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../Libraries/Observables/Observable.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../Libraries/Observables/Observable.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export function deleteFromArray<T>(arr: T[], component: T): boolean {
|
|
2
|
-
const index = arr.indexOf(component);
|
|
3
|
-
if (index === -1) return false;
|
|
4
|
-
const length = arr.length - 1;
|
|
5
|
-
for (let i = index; i < length;) arr[i++] = arr[i];
|
|
6
|
-
arr.length--;
|
|
7
|
-
return true;
|
|
8
|
-
}
|
|
9
|
-
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import {ICollector, ISubscriptionLike} from "./Types";
|
|
2
|
-
import {deleteFromArray} from "../FunctionLibs";
|
|
3
|
-
|
|
4
|
-
export class Collector implements ICollector {
|
|
5
|
-
private list: ISubscriptionLike<any>[] = [];
|
|
6
|
-
private _isDestroyed = false;
|
|
7
|
-
|
|
8
|
-
collect(...subscriptionLikeList: ISubscriptionLike<any>[]): void {
|
|
9
|
-
if(this._isDestroyed) return null;
|
|
10
|
-
for (let i = 0; i < subscriptionLikeList.length; i++) {
|
|
11
|
-
this.list.push(subscriptionLikeList[i]);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
unsubscribe(subscriptionLike: ISubscriptionLike<any>): void {
|
|
16
|
-
if(this._isDestroyed) return null;
|
|
17
|
-
subscriptionLike && subscriptionLike.unsubscribe();
|
|
18
|
-
deleteFromArray(this.list, subscriptionLike);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
unsubscribeAll(): void {
|
|
22
|
-
if(this._isDestroyed) return null;
|
|
23
|
-
const length = this.list.length;
|
|
24
|
-
for (let i = 0; i < length; i++) {
|
|
25
|
-
this.unsubscribe(this.list.pop());
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
size(): number {
|
|
30
|
-
if(this._isDestroyed) return 0;
|
|
31
|
-
return this.list.length;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
destroy(): void {
|
|
35
|
-
this.unsubscribeAll();
|
|
36
|
-
this.list.length = 0;
|
|
37
|
-
this.list = <any>0;
|
|
38
|
-
this._isDestroyed = true;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get isDestroyed(): boolean {
|
|
42
|
-
return this._isDestroyed;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ICallback,
|
|
3
|
-
IListener,
|
|
4
|
-
IObserver,
|
|
5
|
-
IOnceMarker,
|
|
6
|
-
ISetup,
|
|
7
|
-
ISubscribe,
|
|
8
|
-
ISubscribeObject,
|
|
9
|
-
ISubscriptionLike
|
|
10
|
-
} from "./Types";
|
|
11
|
-
import {deleteFromArray} from "../FunctionLibs";
|
|
12
|
-
|
|
13
|
-
export class SubscribeObject<T> implements ISubscribeObject<T> {
|
|
14
|
-
protected observable: IObserver<T>;
|
|
15
|
-
protected listener: IListener<T>;
|
|
16
|
-
private isListenPaused = false;
|
|
17
|
-
private once: IOnceMarker = {isOnce: false, isFinished: false};
|
|
18
|
-
private unsubscribeByNegativeCondition: ICallback<any> = null;
|
|
19
|
-
private unsubscribeByPositiveCondition: ICallback<any> = null;
|
|
20
|
-
private emitByNegativeCondition: ICallback<any> = null;
|
|
21
|
-
private emitByPositiveCondition: ICallback<any> = null;
|
|
22
|
-
private emitMatchCondition: ICallback<any> = null;
|
|
23
|
-
protected _order = 0;
|
|
24
|
-
|
|
25
|
-
constructor(observable?: IObserver<T>, listener?: IListener<T>) {
|
|
26
|
-
this.observable = observable;
|
|
27
|
-
this.listener = listener;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
subscribe(listener: IListener<T>): ISubscriptionLike<T> {
|
|
31
|
-
this.listener = listener;
|
|
32
|
-
return this;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public unsubscribe(): void {
|
|
36
|
-
if (!!this.observable) {
|
|
37
|
-
this.observable.unSubscribe(this);
|
|
38
|
-
this.observable = <any>0;
|
|
39
|
-
this.listener = <any>0;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
send(value: T): void {
|
|
44
|
-
switch (true) {
|
|
45
|
-
case !this.observable:
|
|
46
|
-
case !this.listener:
|
|
47
|
-
this.unsubscribe();
|
|
48
|
-
return;
|
|
49
|
-
case this.isListenPaused:
|
|
50
|
-
return;
|
|
51
|
-
case this.once.isOnce:
|
|
52
|
-
this.once.isFinished = true;
|
|
53
|
-
this.listener(value);
|
|
54
|
-
this.unsubscribe();
|
|
55
|
-
break;
|
|
56
|
-
case !!this.unsubscribeByNegativeCondition:
|
|
57
|
-
if (!this.unsubscribeByNegativeCondition()) {
|
|
58
|
-
this.unsubscribeByNegativeCondition = null;
|
|
59
|
-
this.unsubscribe();
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
this.listener(value);
|
|
63
|
-
break;
|
|
64
|
-
case !!this.unsubscribeByPositiveCondition:
|
|
65
|
-
if (this.unsubscribeByPositiveCondition()) {
|
|
66
|
-
this.unsubscribeByPositiveCondition = null;
|
|
67
|
-
this.unsubscribe();
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this.listener(value);
|
|
71
|
-
break;
|
|
72
|
-
case !!this.emitByNegativeCondition:
|
|
73
|
-
!this.emitByNegativeCondition() && this.listener(value);
|
|
74
|
-
break;
|
|
75
|
-
case !!this.emitByPositiveCondition:
|
|
76
|
-
this.emitByPositiveCondition() && this.listener(value);
|
|
77
|
-
break;
|
|
78
|
-
case !!this.emitMatchCondition:
|
|
79
|
-
(this.emitMatchCondition() === value) && this.listener(value);
|
|
80
|
-
break;
|
|
81
|
-
default:
|
|
82
|
-
this.listener(value);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
setOnce(): ISubscribe<T> {
|
|
87
|
-
this.once.isOnce = true;
|
|
88
|
-
return this;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
unsubscribeByNegative(condition: ICallback<any>): ISubscribe<T> {
|
|
92
|
-
this.unsubscribeByNegativeCondition = condition;
|
|
93
|
-
return this
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
unsubscribeByPositive(condition: ICallback<any>): ISubscribe<T> {
|
|
97
|
-
this.unsubscribeByPositiveCondition = condition;
|
|
98
|
-
return this;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
emitByNegative(condition: ICallback<any>): ISubscribe<T> {
|
|
102
|
-
this.emitByNegativeCondition = condition;
|
|
103
|
-
return this;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
emitByPositive(condition: ICallback<any>): ISubscribe<T> {
|
|
107
|
-
this.emitByPositiveCondition = condition;
|
|
108
|
-
return this;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
emitMatch(condition: ICallback<any>): ISubscribe<T> {
|
|
112
|
-
this.emitMatchCondition = condition;
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
resume(): void {
|
|
117
|
-
this.isListenPaused = false;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
pause(): void {
|
|
121
|
-
this.isListenPaused = true;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
get order(): number {
|
|
125
|
-
return this._order;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
set order(value: number) {
|
|
129
|
-
this._order = value;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export class Observable<T> implements IObserver<T> {
|
|
134
|
-
protected listeners: ISubscribeObject<T>[] = [];
|
|
135
|
-
private _isEnable: boolean = true;
|
|
136
|
-
protected _isDestroyed = false;
|
|
137
|
-
|
|
138
|
-
constructor(private value: T) {
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
disable(): void {
|
|
142
|
-
this._isEnable = false;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
enable(): void {
|
|
146
|
-
this._isEnable = true;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
get isEnable(): boolean {
|
|
150
|
-
return this._isEnable;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
public next(value: T): void {
|
|
154
|
-
if (this._isDestroyed) return;
|
|
155
|
-
if (!this._isEnable) return;
|
|
156
|
-
this.value = value;
|
|
157
|
-
for (let i = 0; i < this.listeners.length; i++) this.listeners[i].send(value);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
public unSubscribe(listener: ISubscriptionLike<T>): void {
|
|
161
|
-
if (this._isDestroyed) return;
|
|
162
|
-
this.listeners &&
|
|
163
|
-
!deleteFromArray(this.listeners, listener);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
public destroy(): void {
|
|
167
|
-
this.value = <any>0;
|
|
168
|
-
this.unsubscribeAll();
|
|
169
|
-
this.listeners = <any>0;
|
|
170
|
-
this._isDestroyed = true;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
public unsubscribeAll(): void {
|
|
174
|
-
if (this._isDestroyed) return;
|
|
175
|
-
const length = this.listeners.length;
|
|
176
|
-
for (let i = 0; i < length; i++) (this.listeners.pop()).unsubscribe();
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
public getValue(): T {
|
|
180
|
-
if (this._isDestroyed) return undefined;
|
|
181
|
-
return this.value;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
public size(): number {
|
|
185
|
-
if (this._isDestroyed) return 0;
|
|
186
|
-
return this.listeners.length;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
public subscribe(listener: IListener<T>): ISubscriptionLike<T> {
|
|
190
|
-
if (this._isDestroyed) return undefined;
|
|
191
|
-
const subscribeObject = new SubscribeObject(this, listener);
|
|
192
|
-
this.listeners.push(subscribeObject);
|
|
193
|
-
return subscribeObject;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
pipe(): ISetup<T> {
|
|
197
|
-
if (this._isDestroyed) return undefined;
|
|
198
|
-
const subscribeObject = new SubscribeObject(this);
|
|
199
|
-
this.listeners.push(subscribeObject);
|
|
200
|
-
return subscribeObject;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
get isDestroyed(): boolean {
|
|
204
|
-
return this._isDestroyed;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import {Observable, SubscribeObject} from "./Observable";
|
|
2
|
-
import {
|
|
3
|
-
ICallback,
|
|
4
|
-
IListener,
|
|
5
|
-
IObserver,
|
|
6
|
-
IOrdered,
|
|
7
|
-
IOrderedObservable,
|
|
8
|
-
IOrderedSetup,
|
|
9
|
-
IOrderedSubscribe,
|
|
10
|
-
IOrderedSubscriptionLike
|
|
11
|
-
} from "./Types";
|
|
12
|
-
|
|
13
|
-
export class OrderedSubscribeObject<T> extends SubscribeObject<T> {
|
|
14
|
-
constructor(observable: OrderedObservable<T> | IOrdered<T>, listener?: IListener<T>) {
|
|
15
|
-
super(<IObserver<T>>observable, listener);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
get order(): number {
|
|
19
|
-
return this._order;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
set order(value: number) {
|
|
23
|
-
if (!this.observable ||
|
|
24
|
-
(this.observable && this.observable.isDestroyed)) {
|
|
25
|
-
this._order = undefined;
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
this._order = value;
|
|
29
|
-
(<IOrderedObservable><any>this.observable).sortByOrder();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
subscribe(listener: IListener<T>): IOrderedSubscriptionLike<T> {
|
|
33
|
-
this.listener = listener;
|
|
34
|
-
return this;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
setOnce(): IOrderedSubscribe<T> {
|
|
38
|
-
return <any>super.setOnce();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
unsubscribeByNegative(condition: ICallback<any>): IOrderedSubscribe<T> {
|
|
42
|
-
return <any>super.unsubscribeByNegative(condition);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
unsubscribeByPositive(condition: ICallback<any>): IOrderedSubscribe<T> {
|
|
46
|
-
return <any>super.unsubscribeByPositive(condition);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
emitByNegative(condition: ICallback<any>): IOrderedSubscribe<T> {
|
|
50
|
-
return <any>super.emitByNegative(condition);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
emitByPositive(condition: ICallback<any>): IOrderedSubscribe<T> {
|
|
54
|
-
return <any>super.emitByPositive(condition);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
emitMatch(condition: ICallback<any>): IOrderedSubscribe<T> {
|
|
58
|
-
return <any>super.emitMatch(condition);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export class OrderedObservable<T>
|
|
63
|
-
extends Observable<T> implements IOrdered<T> {
|
|
64
|
-
sortByOrder(): void {
|
|
65
|
-
if (this._isDestroyed) return undefined;
|
|
66
|
-
this.listeners.sort((a, b) => {
|
|
67
|
-
if (a.order > b.order) return 1;
|
|
68
|
-
if (a.order < b.order) return -1;
|
|
69
|
-
return 0;
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
subscribe(listener: IListener<T>): IOrderedSubscriptionLike<T> {
|
|
74
|
-
if (this._isDestroyed) return undefined;
|
|
75
|
-
const subscribeObject = new OrderedSubscribeObject(this, listener);
|
|
76
|
-
this.listeners.push(subscribeObject);
|
|
77
|
-
return subscribeObject;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
pipe(): IOrderedSetup<T> {
|
|
81
|
-
if (this._isDestroyed) return undefined;
|
|
82
|
-
const subscribeObject = new OrderedSubscribeObject(this);
|
|
83
|
-
this.listeners.push(subscribeObject);
|
|
84
|
-
return subscribeObject;
|
|
85
|
-
}
|
|
86
|
-
}
|