evg_observable 3.1.4 → 3.1.6
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 +17 -18
- package/package.json +1 -1
- package/src/outLib/Observable.d.ts +2 -2
- package/src/outLib/Observable.js +3 -5
- package/src/outLib/OrderedObservable.d.ts +1 -1
- package/src/outLib/OrderedObservable.js +2 -2
- package/src/outLib/Pipe.d.ts +2 -2
- package/src/outLib/SubscriptionTypes.d.ts +1 -1
- package/src/outLib-esm/index.mjs +1 -1
package/README.md
CHANGED
|
@@ -937,9 +937,9 @@ if it passes the condition, is then transformed into its length via a map invoca
|
|
|
937
937
|
down to lengths that are greater than 4. The lengths that pass this condition are thus doubled and the resulting
|
|
938
938
|
observable is set to be a once-off observable to which a listener is subscribed.
|
|
939
939
|
|
|
940
|
-
###
|
|
940
|
+
### observable.in<K, V>()
|
|
941
941
|
|
|
942
|
-
The `in()`
|
|
942
|
+
The `in()` method iterates over object properties, emitting each key-value pair as a `[key, value]` tuple. Mirrors `for...in` semantics. This is useful for processing object data streams.
|
|
943
943
|
|
|
944
944
|
Usage Example:
|
|
945
945
|
|
|
@@ -953,34 +953,33 @@ const users: Record<string, User> = {
|
|
|
953
953
|
user3: { name: "Charlie", age: 35 }
|
|
954
954
|
};
|
|
955
955
|
|
|
956
|
-
const observable$ = new Observable<
|
|
957
|
-
const listener = (
|
|
956
|
+
const observable$ = new Observable<[string, User]>(null);
|
|
957
|
+
const listener = (entry: [string, User]) => console.log('User:', entry[0], entry[1].name, entry[1].age);
|
|
958
958
|
|
|
959
|
-
observable
|
|
960
|
-
|
|
961
|
-
.in<string, User>() // Iterate over object, emit each value
|
|
962
|
-
.subscribe(listener);
|
|
959
|
+
observable$.subscribe(listener);
|
|
960
|
+
observable$.in<string, User>(users); // Emits [key, value] tuples one by one
|
|
963
961
|
|
|
964
962
|
// Output:
|
|
965
|
-
// User: Alice 30
|
|
966
|
-
// User: Bob 25
|
|
967
|
-
// User: Charlie 35
|
|
963
|
+
// User: user1 Alice 30
|
|
964
|
+
// User: user2 Bob 25
|
|
965
|
+
// User: user3 Charlie 35
|
|
968
966
|
```
|
|
969
967
|
|
|
970
|
-
You can also
|
|
968
|
+
You can also use pipe operators on the emitted tuples:
|
|
971
969
|
|
|
972
970
|
```typescript
|
|
973
|
-
const
|
|
971
|
+
const observable$ = new Observable<[string, User]>(null);
|
|
974
972
|
|
|
975
973
|
observable$
|
|
976
974
|
.pipe()
|
|
977
|
-
.
|
|
978
|
-
.subscribe(
|
|
975
|
+
.and(([key, user]) => user.age > 28) // Filter by age
|
|
976
|
+
.subscribe(([key, user]) => console.log('Name:', user.name));
|
|
977
|
+
|
|
978
|
+
observable$.in<string, User>(users);
|
|
979
979
|
|
|
980
980
|
// Output:
|
|
981
|
-
// Name:
|
|
982
|
-
// Name:
|
|
983
|
-
// Name: CHARLIE
|
|
981
|
+
// Name: Alice
|
|
982
|
+
// Name: Charlie
|
|
984
983
|
```
|
|
985
984
|
|
|
986
985
|
### pipe().group()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evg_observable",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.6",
|
|
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",
|
|
@@ -9,7 +9,7 @@ export declare class Observable<T> implements IObserver<T>, IStream<T>, IAddFilt
|
|
|
9
9
|
protected trash: ISubscriptionLike[];
|
|
10
10
|
protected filters: FilterCollection<T>;
|
|
11
11
|
protected _value: T | null;
|
|
12
|
-
constructor(value
|
|
12
|
+
constructor(value?: T | null);
|
|
13
13
|
addFilter(errorHandler?: IErrorCallback): IFilterSetup<T>;
|
|
14
14
|
disable(): void;
|
|
15
15
|
enable(): void;
|
|
@@ -24,7 +24,7 @@ export declare class Observable<T> implements IObserver<T>, IStream<T>, IAddFilt
|
|
|
24
24
|
protected clearDebounceTimers(): void;
|
|
25
25
|
getValue(): T | undefined;
|
|
26
26
|
size(): number;
|
|
27
|
-
subscribe(observer: ISubscribeGroup<T>, errorHandler?: IErrorCallback): ISubscriptionLike
|
|
27
|
+
subscribe(observer: ISubscribeGroup<T>, errorHandler?: IErrorCallback): ISubscriptionLike;
|
|
28
28
|
protected addObserver(subscribeObject: SubscribeObject<T>, observer: ISubscribeGroup<T>, errorHandler?: IErrorCallback): void;
|
|
29
29
|
protected isListener(listener: ISubscribeGroup<T>): boolean;
|
|
30
30
|
pipe(): ISetup<T>;
|
package/src/outLib/Observable.js
CHANGED
|
@@ -12,7 +12,7 @@ class Observable {
|
|
|
12
12
|
trash = [];
|
|
13
13
|
filters = new FilterCollection_1.FilterCollection();
|
|
14
14
|
_value;
|
|
15
|
-
constructor(value) {
|
|
15
|
+
constructor(value = null) {
|
|
16
16
|
this._value = value;
|
|
17
17
|
}
|
|
18
18
|
addFilter(errorHandler) {
|
|
@@ -126,11 +126,9 @@ class Observable {
|
|
|
126
126
|
return this.subs.length;
|
|
127
127
|
}
|
|
128
128
|
subscribe(observer, errorHandler) {
|
|
129
|
-
if (this.killed)
|
|
130
|
-
return undefined;
|
|
131
|
-
if (!this.isListener(observer))
|
|
132
|
-
return undefined;
|
|
133
129
|
const subscribeObject = new SubscribeObject_1.SubscribeObject(this, false);
|
|
130
|
+
if (this.killed || !this.isListener(observer))
|
|
131
|
+
return subscribeObject;
|
|
134
132
|
this.addObserver(subscribeObject, observer, errorHandler);
|
|
135
133
|
return subscribeObject;
|
|
136
134
|
}
|
|
@@ -5,7 +5,7 @@ export declare class OrderedObservable<T> extends Observable<T> implements IOrde
|
|
|
5
5
|
ascendingSort(): boolean;
|
|
6
6
|
descendingSort(): boolean;
|
|
7
7
|
sortByOrder(): boolean;
|
|
8
|
-
subscribe(listener: ISubscribeGroup<T>, errorHandler?: IErrorCallback): IOrderedSubscriptionLike
|
|
8
|
+
subscribe(listener: ISubscribeGroup<T>, errorHandler?: IErrorCallback): IOrderedSubscriptionLike;
|
|
9
9
|
pipe(): IOrderedSetup<T>;
|
|
10
10
|
unSubscribe(listener: ISubscriptionLike): void;
|
|
11
11
|
}
|
|
@@ -21,9 +21,9 @@ class OrderedObservable extends Observable_1.Observable {
|
|
|
21
21
|
return true;
|
|
22
22
|
}
|
|
23
23
|
subscribe(listener, errorHandler) {
|
|
24
|
-
if (!this.isListener(listener))
|
|
25
|
-
return undefined;
|
|
26
24
|
const subscribeObject = new OrderedSubscribeObject_1.OrderedSubscribeObject(this, false);
|
|
25
|
+
if (this.killed || !this.isListener(listener))
|
|
26
|
+
return subscribeObject;
|
|
27
27
|
this.addObserver(subscribeObject, listener, errorHandler);
|
|
28
28
|
return subscribeObject;
|
|
29
29
|
}
|
package/src/outLib/Pipe.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { SwitchCase } from "./AbstractSwitchCase";
|
|
|
3
3
|
export declare abstract class Pipe<T> implements ISubscribe<T> {
|
|
4
4
|
chain: IChainCallback[];
|
|
5
5
|
flow: IPipePayload;
|
|
6
|
-
abstract subscribe(listener: IListener<T> | ISetObservableValue, errorHandler?: IErrorCallback): ISubscriptionLike
|
|
6
|
+
abstract subscribe(listener: IListener<T> | ISetObservableValue, errorHandler?: IErrorCallback): ISubscriptionLike;
|
|
7
7
|
private push;
|
|
8
8
|
once(): ISubscribe<T>;
|
|
9
9
|
take(n: number): ISubscribe<T>;
|
|
@@ -24,6 +24,6 @@ export declare abstract class Pipe<T> implements ISubscribe<T> {
|
|
|
24
24
|
processChain(listener?: IListener<T>): void;
|
|
25
25
|
}
|
|
26
26
|
export declare class PipeSwitchCase<T> extends SwitchCase<T, Pipe<T>, IPipeCase<T>> implements ISubscribe<T> {
|
|
27
|
-
subscribe(listener: IListener<T> | ISetObservableValue, errorHandler?: IErrorCallback): ISubscriptionLike
|
|
27
|
+
subscribe(listener: IListener<T> | ISetObservableValue, errorHandler?: IErrorCallback): ISubscriptionLike;
|
|
28
28
|
group(): IGroupSubscription<T>;
|
|
29
29
|
}
|
|
@@ -7,7 +7,7 @@ export type IGroupSubscription<T> = ISubscriptionLike & {
|
|
|
7
7
|
add(listener: IListener<T> | IListener<T>[], errorHandler?: IErrorCallback | IErrorCallback[]): IGroupSubscription<T>;
|
|
8
8
|
};
|
|
9
9
|
export type ISubscribe<T> = {
|
|
10
|
-
subscribe(listener: ISubscribeGroup<T>, errorHandler?: IErrorCallback): ISubscriptionLike
|
|
10
|
+
subscribe(listener: ISubscribeGroup<T>, errorHandler?: IErrorCallback): ISubscriptionLike;
|
|
11
11
|
};
|
|
12
12
|
export type IOrderedSubscribe<T> = {
|
|
13
13
|
subscribe(listener: IListener<T>, errorHandler?: IErrorCallback): IOrderedSubscriptionLike;
|
package/src/outLib-esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
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 b=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 d=class{chain=[];flow={isBreak:!1,isUnsubscribe:!1,isAvailable:!1,debounceMs:0,debounceTimer:0,debounceValue:void 0,debounceIndex:0,payload:null};push(e){return this.chain.push(e),this}once(){return this.push(e=>{this.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++,this.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})}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}processChain(e){let r=this.chain,i=this.flow,s=r.length;for(let n=0;n<s;n++){if(i.isUnsubscribe=!1,i.isAvailable=!1,i.debounceMs=0,r[n](i),i.isUnsubscribe)return this.unsubscribe();if(i.debounceMs>0){i.debounceValue=i.payload,i.debounceIndex=n+1;let l=()=>{i.debounceTimer=0,i.payload=i.debounceValue,i.isBreak=!1;for(let a=i.debounceIndex;a<s;a++){if(i.isUnsubscribe=!1,i.isAvailable=!1,i.debounceMs=0,r[a](i),i.isUnsubscribe)return this.unsubscribe();if(i.debounceMs>0){i.debounceValue=i.payload,i.debounceIndex=a+1,clearTimeout(i.debounceTimer),i.debounceTimer=setTimeout(l,i.debounceMs);return}if(!i.isAvailable)return;if(i.isBreak)break}e&&e(i.payload)};clearTimeout(i.debounceTimer),i.debounceTimer=setTimeout(l,i.debounceMs);return}if(!i.isAvailable)return;if(i.isBreak)break}i.isAvailable=!0,e&&e(i.payload)}},f=class extends b{subscribe(e,r){return this.pipe.subscribe(e,r)}group(){return this.pipe}};var u=class extends d{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 a=0;a<s.length;a++)try{s[a](l)}catch(O){n[a](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 p=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 T(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}},T=class extends b{};var c=class{subs=[];enabled=!0;killed=!1;process=!1;trash=[];filters=new p;_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 h=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 y=class extends c{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 h(this,!1);return this.killed||!this.isListener(e)||this.addObserver(i,e,r),i}pipe(){if(this.killed)return;let e=new h(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,c as Observable,y as OrderedObservable,o as deleteFromArray,C as quickDeleteFromArray};
|