evg_observable 3.1.7 → 3.1.8
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/package.json +1 -1
- package/src/outLib/CoreTypes.d.ts +2 -0
- package/src/outLib/Pipe.d.ts +1 -0
- package/src/outLib/Pipe.js +35 -49
- package/src/outLib-esm/index.mjs +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evg_observable",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.8",
|
|
4
4
|
"description": "Lightweight reactive Observable library (zero dependencies) — 2-7x faster than RxJS, 1.5-3x faster than observable-fns. Pipe operators: throttle, debounce, distinctUntilChanged, map, tap. Original hot-observable architecture, not a fork or wrapper.",
|
|
5
5
|
"main": "./src/outLib/index.js",
|
|
6
6
|
"module": "./src/outLib-esm/index.mjs",
|
|
@@ -36,6 +36,8 @@ export type IPipePayload = {
|
|
|
36
36
|
debounceValue: any;
|
|
37
37
|
debounceIndex: number;
|
|
38
38
|
payload: any;
|
|
39
|
+
listener: any;
|
|
40
|
+
index: number;
|
|
39
41
|
};
|
|
40
42
|
export type IChainCallback = (data: IPipePayload) => void;
|
|
41
43
|
export type ICombinedSubscriber<T> = IListener<T> | ISetObservableValue;
|
package/src/outLib/Pipe.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare abstract class Pipe<T> implements ISubscribe<T> {
|
|
|
21
21
|
toJson(): ISetup<string>;
|
|
22
22
|
fromJson<K>(): ISetup<K>;
|
|
23
23
|
group(): IGroupSubscription<T>;
|
|
24
|
+
runChain(startIndex: number, len: number, data: IPipePayload): void;
|
|
24
25
|
processChain(listener?: IListener<T>): void;
|
|
25
26
|
}
|
|
26
27
|
export declare class PipeSwitchCase<T> extends SwitchCase<T, Pipe<T>, IPipeCase<T>> implements ISubscribe<T> {
|
package/src/outLib/Pipe.js
CHANGED
|
@@ -12,7 +12,9 @@ class Pipe {
|
|
|
12
12
|
debounceTimer: 0,
|
|
13
13
|
debounceValue: undefined,
|
|
14
14
|
debounceIndex: 0,
|
|
15
|
-
payload: null
|
|
15
|
+
payload: null,
|
|
16
|
+
listener: undefined,
|
|
17
|
+
index: 0
|
|
16
18
|
};
|
|
17
19
|
push(callback) {
|
|
18
20
|
this.chain.push(callback);
|
|
@@ -20,7 +22,8 @@ class Pipe {
|
|
|
20
22
|
}
|
|
21
23
|
once() {
|
|
22
24
|
return this.push((data) => {
|
|
23
|
-
|
|
25
|
+
if (data.listener)
|
|
26
|
+
data.listener(data.payload);
|
|
24
27
|
data.isUnsubscribe = true;
|
|
25
28
|
});
|
|
26
29
|
}
|
|
@@ -34,7 +37,8 @@ class Pipe {
|
|
|
34
37
|
return;
|
|
35
38
|
}
|
|
36
39
|
count++;
|
|
37
|
-
|
|
40
|
+
if (data.listener)
|
|
41
|
+
data.listener(data.payload);
|
|
38
42
|
if (count >= n)
|
|
39
43
|
data.isUnsubscribe = true;
|
|
40
44
|
});
|
|
@@ -106,6 +110,22 @@ class Pipe {
|
|
|
106
110
|
return this.push((data) => {
|
|
107
111
|
data.isAvailable = true;
|
|
108
112
|
data.debounceMs = ms;
|
|
113
|
+
data.debounceValue = data.payload;
|
|
114
|
+
data.debounceIndex = data.index + 1;
|
|
115
|
+
const len = this.chain.length;
|
|
116
|
+
clearTimeout(data.debounceTimer);
|
|
117
|
+
data.debounceTimer = setTimeout(() => {
|
|
118
|
+
try {
|
|
119
|
+
data.payload = data.debounceValue;
|
|
120
|
+
data.isBreak = false;
|
|
121
|
+
this.runChain(data.debounceIndex, len, data);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const errorHandler = this.errorHandler;
|
|
125
|
+
if (errorHandler)
|
|
126
|
+
errorHandler(data.payload, err);
|
|
127
|
+
}
|
|
128
|
+
}, ms);
|
|
109
129
|
});
|
|
110
130
|
}
|
|
111
131
|
distinctUntilChanged(comparator) {
|
|
@@ -140,65 +160,31 @@ class Pipe {
|
|
|
140
160
|
group() {
|
|
141
161
|
return this;
|
|
142
162
|
}
|
|
143
|
-
|
|
163
|
+
runChain(startIndex, len, data) {
|
|
144
164
|
const chain = this.chain;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
for (let i = 0; i < len; i++) {
|
|
165
|
+
for (let i = startIndex; i < len; i++) {
|
|
166
|
+
data.index = i;
|
|
148
167
|
data.isUnsubscribe = false;
|
|
149
168
|
data.isAvailable = false;
|
|
150
169
|
data.debounceMs = 0;
|
|
151
170
|
chain[i](data);
|
|
152
171
|
if (data.isUnsubscribe)
|
|
153
172
|
return this.unsubscribe();
|
|
154
|
-
if (data.debounceMs > 0)
|
|
155
|
-
data.debounceValue = data.payload;
|
|
156
|
-
data.debounceIndex = i + 1;
|
|
157
|
-
const continueChain = () => {
|
|
158
|
-
try {
|
|
159
|
-
data.debounceTimer = 0;
|
|
160
|
-
data.payload = data.debounceValue;
|
|
161
|
-
data.isBreak = false;
|
|
162
|
-
for (let j = data.debounceIndex; j < len; j++) {
|
|
163
|
-
data.isUnsubscribe = false;
|
|
164
|
-
data.isAvailable = false;
|
|
165
|
-
data.debounceMs = 0;
|
|
166
|
-
chain[j](data);
|
|
167
|
-
if (data.isUnsubscribe)
|
|
168
|
-
return this.unsubscribe();
|
|
169
|
-
if (data.debounceMs > 0) {
|
|
170
|
-
data.debounceValue = data.payload;
|
|
171
|
-
data.debounceIndex = j + 1;
|
|
172
|
-
clearTimeout(data.debounceTimer);
|
|
173
|
-
data.debounceTimer = setTimeout(continueChain, data.debounceMs);
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (!data.isAvailable)
|
|
177
|
-
return;
|
|
178
|
-
if (data.isBreak)
|
|
179
|
-
break;
|
|
180
|
-
}
|
|
181
|
-
if (listener)
|
|
182
|
-
listener(data.payload);
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
const errorHandler = this.errorHandler;
|
|
186
|
-
if (errorHandler)
|
|
187
|
-
errorHandler(data.payload, err);
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
clearTimeout(data.debounceTimer);
|
|
191
|
-
data.debounceTimer = setTimeout(continueChain, data.debounceMs);
|
|
173
|
+
if (data.debounceMs > 0)
|
|
192
174
|
return;
|
|
193
|
-
}
|
|
194
175
|
if (!data.isAvailable)
|
|
195
176
|
return;
|
|
196
177
|
if (data.isBreak)
|
|
197
178
|
break;
|
|
198
179
|
}
|
|
199
|
-
data.
|
|
200
|
-
|
|
201
|
-
|
|
180
|
+
if (data.listener)
|
|
181
|
+
data.listener(data.payload);
|
|
182
|
+
}
|
|
183
|
+
processChain(listener) {
|
|
184
|
+
const data = this.flow;
|
|
185
|
+
data.listener = listener;
|
|
186
|
+
data.isBreak = false;
|
|
187
|
+
this.runChain(0, this.chain.length, data);
|
|
202
188
|
}
|
|
203
189
|
}
|
|
204
190
|
exports.Pipe = Pipe;
|
package/src/outLib-esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function I(t,e){return t.order>e.order?1:t.order<e.order?-1:0}function k(t,e){return t.order>e.order?-1:t.order<e.order?1:0}function o(t,e){let r=t.indexOf(e);return r===-1?!1:(t.splice(r,1),!0)}function C(t,e){let r=t.indexOf(e);return r===-1?!1:(t[r]=t[t.length-1],t.length--,!0)}function v(t){if(Array.isArray(t)){let e=t.length,r=new Array(e);for(let i=0;i<e;i++)r[i]=S(t[i]);return i=>{for(let s=0;s<e;s++)r[s](i)}}return S(t)}function S(t){return"next"in t?e=>t.next(e):t}var a=class{pipe;counter;constructor(e){this.pipe=e,this.counter=e.chain.length?e.chain.length:0}or(e){this.counter++;let r=this.counter,i=this.pipe.chain;return i.push(s=>{s.isAvailable=!0,e(s.payload)&&(s.isBreak=!0),r===i.length&&!s.isBreak&&(s.isAvailable=!1)}),this}anyOf(e){if(!Array.isArray(e))return this;for(let r=0;r<e.length;r++)this.or(e[r]);return this}};var p=class{chain=[];flow={isBreak:!1,isUnsubscribe:!1,isAvailable:!1,debounceMs:0,debounceTimer:0,debounceValue:void 0,debounceIndex:0,payload:null,listener:void 0,index:0};push(e){return this.chain.push(e),this}once(){return this.push(e=>{e.listener&&e.listener(e.payload),e.isUnsubscribe=!0})}take(e){e<0&&(e=0);let r=0;return this.push(i=>{if(r>=e){i.isUnsubscribe=!0;return}r++,i.listener&&i.listener(i.payload),r>=e&&(i.isUnsubscribe=!0)})}skip(e){e<0&&(e=0);let r=0;return this.push(i=>{if(r<e){r++;return}i.isAvailable=!0})}unsubscribeBy(e){return this.push(r=>{r.isAvailable=!0,e(r.payload)&&(r.isUnsubscribe=!0)})}and(e){return this.push(r=>{e(r.payload)&&(r.isAvailable=!0)})}allOf(e){if(!Array.isArray(e))return this;for(let r=0;r<e.length;r++)this.and(e[r]);return this}choice(){return new f(this)}map(e){return this.push(r=>{r.payload=e(r.payload),r.isAvailable=!0})}scan(e,r){let i=r;return this.push(s=>{i=e(i,s.payload),s.payload=i,s.isAvailable=!0})}tap(e){return this.push(r=>{e(r.payload),r.isAvailable=!0})}throttle(e){let r=0;return this.push(i=>{let s=Date.now();s-r>=e&&(r=s,i.isAvailable=!0)})}debounce(e){return this.push(r=>{r.isAvailable=!0,r.debounceMs=e,r.debounceValue=r.payload,r.debounceIndex=r.index+1;let i=this.chain.length;clearTimeout(r.debounceTimer),r.debounceTimer=setTimeout(()=>{try{r.payload=r.debounceValue,r.isBreak=!1,this.runChain(r.debounceIndex,i,r)}catch(s){let n=this.errorHandler;n&&n(r.payload,s)}},e)})}distinctUntilChanged(e){let r=!1,i;return this.push(s=>{let n=s.payload;r&&(e?e(i,n):i===n)||(r=!0,i=n,s.isAvailable=!0)})}toJson(){return this.push(e=>{e.payload=JSON.stringify(e.payload),e.isAvailable=!0})}fromJson(){return this.push(e=>{e.payload=JSON.parse(e.payload),e.isAvailable=!0})}group(){return this}runChain(e,r,i){let s=this.chain;for(let n=e;n<r;n++){if(i.index=n,i.isUnsubscribe=!1,i.isAvailable=!1,i.debounceMs=0,s[n](i),i.isUnsubscribe)return this.unsubscribe();if(i.debounceMs>0||!i.isAvailable)return;if(i.isBreak)break}i.listener&&i.listener(i.payload)}processChain(e){let r=this.flow;r.listener=e,r.isBreak=!1,this.runChain(0,this.chain.length,r)}},f=class extends a{subscribe(e,r){return this.pipe.subscribe(e,r)}group(){return this.pipe}};var u=class extends p{observer;listener;errorHandler=(e,r)=>{console.log(`(Unit of SubscribeObject).send(${e}) ERROR:`,r)};_order=0;paused=!1;piped=!1;listeners;errorHandlers;constructor(e,r){super(),this.observer=e,this.piped=!!r}subscribe(e,r){return this.listener=v(e),r&&(this.errorHandler=r),this}add(e,r){if(this.listeners||(this.listeners=[],this.errorHandlers=[]),Array.isArray(e))for(let i=0;i<e.length;i++){this.listeners.push(e[i]);let s=r&&Array.isArray(r)?r[i]??this.errorHandler:r||this.errorHandler;this.errorHandlers.push(s)}else{this.listeners.push(e);let i=r&&!Array.isArray(r)?r:this.errorHandler;this.errorHandlers.push(i)}return this}unsubscribe(){this.observer&&(clearTimeout(this.flow.debounceTimer),this.observer.unSubscribe(this),this.observer=void 0,this.listener=void 0,this.chain.length=0)}send(e){let r=this.listener,i=this.listeners&&this.listeners.length>0;if(!r&&!i){this.unsubscribe();return}if(!(!this.observer||this.paused)){if(!this.piped){if(r)try{r(e)}catch(s){this.errorHandler(e,s)}return}try{if(this.flow.payload=e,this.flow.isBreak=!1,i){let s=this.listeners,n=this.errorHandlers;this.processChain(l=>{r&&r(l);for(let h=0;h<s.length;h++)try{s[h](l)}catch(O){n[h](l,O)}})}else this.processChain(r)}catch(s){this.errorHandler(e,s)}}}resume(){this.paused=!1}pause(){this.paused=!0}get order(){return this._order}set order(e){this._order=e}};var d=class{chain=[];flow={isBreak:!1,isAvailable:!1,payload:null};response={isOK:!1,payload:void 0};errHandler;get isEmpty(){return!this.chain.length}push(e){return this.chain.push(e),this}and(e){return this.push(r=>{e(r.payload)&&(r.isAvailable=!0)})}allOf(e){if(!Array.isArray(e))return this;for(let r=0;r<e.length;r++)this.and(e[r]);return this}choice(){return new y(this)}processChain(e){let r=this.chain,i=this.flow,s=this.response;s.isOK=!1,s.payload=void 0,i.payload=e,i.isBreak=!1;try{let n=r.length;for(let l=0;l<n;l++){if(i.isAvailable=!1,r[l](i),!i.isAvailable)return s;if(i.isBreak)break}}catch(n){return this.errHandler?this.errHandler(n,"Filter.processChain ERROR:"):console.log("Filter.processChain ERROR:",n),s}return s.isOK=!0,s.payload=i.payload,s}addErrorHandler(e){this.errHandler=e}},y=class extends a{};var b=class{subs=[];enabled=!0;killed=!1;process=!1;trash=[];filters=new d;_value;constructor(e=null){this._value=e}addFilter(e){return e&&this.filters.addErrorHandler(e),this.filters}disable(){this.enabled=!1}enable(){this.enabled=!0}get isEnable(){return this.enabled}next(e){if(this.killed||!this.enabled||!this.subs.length||!this.filters.isEmpty&&!this.filters.processChain(e).isOK)return;this.process=!0,this._value=e;let r=this.subs,i=r.length;for(let s=0;s<i;s++)r[s].send(e);if(this.process=!1,this.killed){this.clearDebounceTimers(),this._value=null,this.subs.length=0;return}this.trash.length&&this.clearTrash()}of(e){if(!this.killed&&this.enabled)for(let r=0;r<e.length;r++)this.next(e[r])}in(e){if(!this.killed&&this.enabled)for(let r in e)Object.hasOwn(e,r)&&this.next([r,e[r]])}clearTrash(){let e=this.trash.length;for(let r=0;r<e;r++)this.unSubscribe(this.trash[r]);this.trash.length=0}unSubscribe(e){if(!this.killed){if(this.process&&e){this.trash.push(e);return}this.subs&&o(this.subs,e)}}destroy(){this.killed||(this.killed=!0,this.process||(this.clearDebounceTimers(),this._value=null,this.subs.length=0))}unsubscribeAll(){if(!this.killed){if(this.process){this.clearDebounceTimers();let e=this.subs;for(let r=0;r<e.length;r++)this.trash.push(e[r]);return}this.clearDebounceTimers(),this.subs.length=0}}clearDebounceTimers(){let e=this.subs;for(let r=0;r<e.length;r++)clearTimeout(e[r].flow.debounceTimer)}getValue(){if(!this.killed)return this._value}size(){return this.killed?0:this.subs.length}subscribe(e,r){let i=new u(this,!1);return this.killed||!this.isListener(e)||this.addObserver(i,e,r),i}addObserver(e,r,i){e.subscribe(r,i),this.subs.push(e)}isListener(e){return this.killed?!1:!!e}pipe(){if(this.killed)return;let e=new u(this,!0);return this.subs.push(e),e}get isDestroyed(){return this.killed}};var c=class extends u{constructor(e,r){super(e,r)}get order(){return this._order}set order(e){if(!this.observer||this.observer&&this.observer.isDestroyed){this._order=void 0;return}this._order=e,this.observer.sortByOrder()}subscribe(e,r){return super.subscribe(e,r),this}once(){return super.once()}take(e){return super.take(e)}skip(e){return super.skip(e)}scan(e,r){return super.scan(e,r)}};var T=class extends b{sortDirection=I;ascendingSort(){return this.sortDirection=I,this.sortByOrder()}descendingSort(){return this.sortDirection=k,this.sortByOrder()}sortByOrder(){return this.killed?!1:(this.subs.sort(this.sortDirection),!0)}subscribe(e,r){let i=new c(this,!1);return this.killed||!this.isListener(e)||this.addObserver(i,e,r),i}pipe(){if(this.killed)return;let e=new c(this,!0);return this.subs.push(e),e}unSubscribe(e){if(!this.killed){if(this.process&&e){this.trash.push(e);return}this.subs&&o(this.subs,e)}}};var m=class{arr=[];killed=!1;collect(...e){this.killed||this.arr.push(...e)}unsubscribe(e){this.killed||(e?.unsubscribe(),o(this.arr,e))}unsubscribeAll(){if(this.killed)return;let e=this.arr;for(let r=0;r<e.length;r++)e[r].unsubscribe();e.length=0}size(){return this.killed?0:this.arr.length}destroy(){this.unsubscribeAll(),this.arr.length=0,this.arr=0,this.killed=!0}get isDestroyed(){return this.killed}};export{m as Collector,b as Observable,T as OrderedObservable,o as deleteFromArray,C as quickDeleteFromArray};
|