@cyysummer/projector 0.0.4 → 0.0.5
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/dist/index.js +2 -2
- package/package.json +1 -1
- package/types/lib.d.ts +18 -8
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @cyysummer/projector v0.0.
|
|
2
|
+
* @cyysummer/projector v0.0.5
|
|
3
3
|
* (c) 2021-PRESENT Chris Liu
|
|
4
4
|
* @license MIT
|
|
5
5
|
**/
|
|
6
|
-
import
|
|
6
|
+
import E from"on-change";import{set as g}from"lodash-es";import{withEvents as I}from"@cyysummer/core";var i=class extends I(){constructor(e){super();this._paused=!1;this._shadow=structuredClone(e)}receive(e,r){if(this._paused)return;g(this._shadow,e,r);let c=[{path:e,value:r}];this.emit("record",{next:this._shadow,patches:c}),this._ensureProjector(),this._projector?.project(this._shadow,...c)}sendTo(e){typeof e=="function"?this._projectorFactory=e:this._projector=e}pause(){this._paused=!0}resume(){this._paused=!1}_ensureProjector(){!this._projector&&this._projectorFactory&&(this._projector=this._projectorFactory())}};import{get as d}from"lodash-es";var l=u=>{},p=class{constructor(t){this._strategy=t}chain(t){return async(e,r)=>{let c=n(r);for(let o of t)await o(e,{value:c})}}chainWith(t,e){return async(c,o)=>{let s=n(o),a=e(s);for(let f of t)await f(c,{value:a})}}create(t){return(e,r)=>{let c=n(r);return this._strategy.execute(e,t,c)}}createIf(t,e,r=l){return(c,o)=>{let s=n(o);return(t(s)?e:r)(c,{value:s})}}createIfRoot(t,e,r=l){return(c,o)=>(t(o.source)?e:r)(c,o)}createRoot(t,e){return(r,c)=>{let o=e(c.source);return this._strategy.execute(r,t,o)}}createForArray(t){return(e,r)=>{let c=r.path?d(r.source,r.path):r.value;if(c&&Array.isArray(c)&&c.length>0){let o=Object.keys(c[0]);return this._strategy.executeArray(e,t,o,c)}}}createForRaw(t,e){return(r,c)=>this._strategy.execute(r,t,e)}createWith(t,e){return(c,o)=>{let s=n(o),a=e(s);return this._strategy.execute(c,t,a)}}};function n(u){return u.source&&u.path?d(u.source,u.path):u.value}var h=class{constructor(t){this._schema=t;if(!t)throw new Error("Projector: Schema is required.")}project(t,...e){for(let r of e)this._dispatch(t,r)}_dispatch(t,e){let{path:r,value:c}=e,o=this._resolveEffect(r);o&&(this._ensureScheduler(),this._scheduler.enqueue({path:r.join("."),effect:o,ctx:{source:t,path:r,value:c}}))}_ensureScheduler(){if(!this._scheduler)throw new Error("Projector: no scheduler.")}_resolveEffect(t){let e=this._schema;for(let r of t){if(!e)return null;e=e[r]}return typeof e=="function"?e:null}},S=class extends h{constructor(t,e){super(t),this._scheduler=e}},y=class extends h{scheduleWith(t){return typeof t=="function"?this._schedulerFactory=t:this._scheduler=t,this}_ensureScheduler(){if(!this._scheduler&&this._schedulerFactory&&(this._scheduler=this._schedulerFactory()),!this._scheduler)throw new Error("Projector: no scheduler.")}};var T=class{constructor(t){this._target=t}withTarget(t){return typeof t=="function"?this._targetFactory=t:this._target=t,this}checkTarget(){if(!this._target&&this._targetFactory&&(this._target=this._targetFactory()),!this._target)throw new Error("Scheduler: target is not set")}},_=class extends T{constructor(){super(...arguments);this._queue=new Map}enqueue(e){return this._queue.set(e.path,e),this}async flush(){this.checkTarget(),log.trace("BufferedScheduler: flushing");let e=[...this._queue.values()];this._queue.clear();for(let r of e){let{effect:c,ctx:o}=r,s=c(this._target,o);s instanceof Promise&&await s}}};function C(u){let t=new i(u);return[E(u,t.receive.bind(t),{pathAsArray:!0}),t]}export{_ as BufferedScheduler,y as DynamicProjector,p as EffectBuilder,S as Projector,h as ProjectorBase,i as Recorder,T as Scheduler,C as track};
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
package/types/lib.d.ts
CHANGED
|
@@ -106,7 +106,7 @@ declare class Recorder<TSource extends object> extends Recorder_base {
|
|
|
106
106
|
sendTo(factory: Func<IProjector<TSource>>): void;
|
|
107
107
|
pause(): void;
|
|
108
108
|
resume(): void;
|
|
109
|
-
private
|
|
109
|
+
private _ensureProjector;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/**
|
|
@@ -179,13 +179,23 @@ declare class EffectBuilder<TTarget, TSource extends object> {
|
|
|
179
179
|
createWith<T, R>(at: string, customizer: Func1<T, R>): Effect<TSource, R>;
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
declare class
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
constructor(_schema: Schema<TSource
|
|
182
|
+
declare abstract class ProjectorBase<TSource> implements IProjector<TSource> {
|
|
183
|
+
protected _schema: Schema<TSource>;
|
|
184
|
+
protected _scheduler?: IScheduler<any>;
|
|
185
|
+
constructor(_schema: Schema<TSource>);
|
|
186
186
|
project(next: TSource, ...patches: Patch[]): void;
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
protected _dispatch(next: TSource, patch: Patch): void;
|
|
188
|
+
protected _ensureScheduler(): void;
|
|
189
|
+
protected _resolveEffect(path: (string | symbol)[]): Effect<TSource, any> | null;
|
|
190
|
+
}
|
|
191
|
+
declare class Projector<TSource> extends ProjectorBase<TSource> {
|
|
192
|
+
constructor(_schema: Schema<TSource>, _scheduler: IScheduler<any>);
|
|
193
|
+
}
|
|
194
|
+
declare class DynamicProjector<TSource> extends ProjectorBase<TSource> {
|
|
195
|
+
private _schedulerFactory?;
|
|
196
|
+
scheduleWith(scheduler: IScheduler<any>): IProjector<TSource>;
|
|
197
|
+
scheduleWith(schedulerFactory: Func<IScheduler<any>>): IProjector<TSource>;
|
|
198
|
+
protected _ensureScheduler(): void;
|
|
189
199
|
}
|
|
190
200
|
|
|
191
201
|
/**
|
|
@@ -217,4 +227,4 @@ declare class BufferedScheduler<TTarget> extends Scheduler<TTarget> {
|
|
|
217
227
|
*/
|
|
218
228
|
declare function track<TSource extends object>(initial: TSource): [TSource, Recorder<TSource>];
|
|
219
229
|
|
|
220
|
-
export { BufferedScheduler, EffectBuilder, Projector, Recorder, Scheduler, track };
|
|
230
|
+
export { BufferedScheduler, DynamicProjector, EffectBuilder, Projector, ProjectorBase, Recorder, Scheduler, track };
|