@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * @cyysummer/projector v0.0.4
2
+ * @cyysummer/projector v0.0.5
3
3
  * (c) 2021-PRESENT Chris Liu
4
4
  * @license MIT
5
5
  **/
6
- import _ from"on-change";import{set as d}from"lodash-es";import{withEvents as g}from"@cyysummer/core";var i=class extends g(){constructor(e){super();this._paused=!1;this._shadow=structuredClone(e)}receive(e,r){if(this._paused)return;d(this._shadow,e,r);let c=[{path:e,value:r}];this.emit("record",{next:this._shadow,patches:c}),this._checkProjector(),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}_checkProjector(){!this._projector&&this._projectorFactory&&(this._projector=this._projectorFactory())}};import{get as l}from"lodash-es";var h=a=>{},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 u=n(o),s=e(u);for(let f of t)await f(c,{value:s})}}create(t){return(e,r)=>{let c=n(r);return this._strategy.execute(e,t,c)}}createIf(t,e,r=h){return(c,o)=>{let u=n(o);return(t(u)?e:r)(c,{value:u})}}createIfRoot(t,e,r=h){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?l(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 u=n(o),s=e(u);return this._strategy.execute(c,t,s)}}};function n(a){return a.source&&a.path?l(a.source,a.path):a.value}var y=class{constructor(t,e){this._schema=t;this._scheduler=e}project(t,...e){if(!this._schema)throw new Error("Schema not loaded");for(let r of e)this._dispatch(t,r)}_dispatch(t,e){let{path:r,value:c}=e,o=this._resolveEffect(r);o&&this._scheduler.enqueue({path:r.join("."),effect:o,ctx:{source:t,path:r,value:c}})}_resolveEffect(t){let e=this._schema;for(let r of t){if(!e)return null;e=e[r]}return typeof e=="function"?e:null}};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")}},S=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,u=c(this._target,o);u instanceof Promise&&await u}}};function F(a){let t=new i(a);return[_(a,t.receive.bind(t),{pathAsArray:!0}),t]}export{S as BufferedScheduler,p as EffectBuilder,y as Projector,i as Recorder,T as Scheduler,F as track};
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyysummer/projector",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "A powerful state projection library for creating anything.",
5
5
  "license": "MIT",
6
6
  "author": "Chris Liu",
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 _checkProjector;
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 Projector<TSource> implements IProjector<TSource> {
183
- private _schema;
184
- private _scheduler;
185
- constructor(_schema: Schema<TSource>, _scheduler: IScheduler<any>);
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
- private _dispatch;
188
- private _resolveEffect;
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 };