side-effect-manager
Advanced tools
Comparing version 1.1.0 to 1.1.1
export declare type AsyncSideEffectDisposer = () => Promise<any> | any; | ||
export declare type AsyncSideEffectExecutor = () => Promise<AsyncSideEffectDisposer | AsyncSideEffectDisposer[]> | AsyncSideEffectDisposer | AsyncSideEffectDisposer[]; | ||
export declare type AsyncSideEffectExecutor = () => Promise<AsyncSideEffectDisposer | AsyncSideEffectDisposer[]> | AsyncSideEffectDisposer | AsyncSideEffectDisposer[] | null | false; | ||
export declare class AsyncSideEffectManager { | ||
/** | ||
* Add a side effect. | ||
* @param executor execute side effect | ||
* @param executor Execute side effect. Return a disposer or a disposer array. Return null or false to ignore. | ||
* @param disposerID Optional id for the disposer | ||
@@ -8,0 +8,0 @@ * @returns disposerID |
@@ -1,2 +0,2 @@ | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports[Symbol.toStringTag]="Module";const s="!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e=s.length,t=Array(20),i=()=>{for(let i=0;i<20;i++)t[i]=s.charAt(Math.random()*e);return t.join("")};function r(s){try{return s()}catch(e){console.error(e)}}exports.AsyncSideEffectManager=class{constructor(){this.finished=Promise.resolve(),this.disposers=new Map,this._nextTask=new Map,this._isRunning=new Set}add(s,e=this.genUID()){return this._isRunning.has(e)?this._nextTask.set(e,(()=>this._add(s,e))):this._add(s,e),e}async _add(s,e){this._startTask(e);const t=this.remove(e);if(t)try{await t()}catch(n){console.error(n)}try{const t=await s();this.disposers.set(e,Array.isArray(t)?async()=>Promise.all(t.map(r)):t)}catch(n){console.error(n)}this._endTask(e);const i=this._nextTask.get(e);i&&(this._nextTask.delete(e),i())}addDisposer(s,e=this.genUID()){return this.add((()=>s),e)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){this._isRunning.has(s)?this._nextTask.set(s,(()=>this._flush(s))):this._flush(s)}async _flush(s){const e=this.remove(s);if(e){this._startTask(s);try{await e()}catch(i){console.error(i)}this._endTask(s)}const t=this._nextTask.get(s);t&&(this._nextTask.delete(s),t())}flushAll(){this.disposers.forEach(((s,e)=>this.flush(e)))}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}_startTask(s){this._isRunning.add(s),this._resolveFinished||(this.finished=new Promise((s=>{this._resolveFinished=s})))}_endTask(s){this._isRunning.delete(s),this._resolveFinished&&this._isRunning.size<=0&&this._nextTask.size<=0&&(this._resolveFinished(),this._resolveFinished=void 0)}},exports.SideEffectManager=class{constructor(){this.disposers=new Map}addDisposer(s,e=this.genUID()){return this.flush(e),this.disposers.set(e,Array.isArray(s)?()=>s.forEach(r):s),e}add(s,e=this.genUID()){return this.addDisposer(s(),e)}addEventListener(s,e,t,i,r=this.genUID()){return s.addEventListener(e,t,i),this.addDisposer((()=>s.removeEventListener(e,t,i)),r),r}setTimeout(s,e,t=this.genUID()){const i=window.setTimeout((()=>{this.remove(t),s()}),e);return this.addDisposer((()=>window.clearTimeout(i)),t)}setInterval(s,e,t=this.genUID()){const i=window.setInterval(s,e);return this.addDisposer((()=>window.clearInterval(i)),t)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){const e=this.remove(s);if(e)try{e()}catch(t){console.error(t)}}flushAll(){this.disposers.forEach(r),this.disposers.clear()}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}},exports.genUID=i; | ||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports[Symbol.toStringTag]="Module";const s="!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e=s.length,t=Array(20),i=()=>{for(let i=0;i<20;i++)t[i]=s.charAt(Math.random()*e);return t.join("")};function r(s){try{return s()}catch(e){console.error(e)}}exports.AsyncSideEffectManager=class{constructor(){this.finished=Promise.resolve(),this.disposers=new Map,this._nextTask=new Map,this._isRunning=new Set}add(s,e=this.genUID()){return this._isRunning.has(e)?this._nextTask.set(e,(()=>this._add(s,e))):this._add(s,e),e}async _add(s,e){this._startTask(e);const t=this.remove(e);if(t)try{await t()}catch(n){console.error(n)}try{const t=await s();t&&this.disposers.set(e,Array.isArray(t)?async()=>Promise.all(t.map(r)):t)}catch(n){console.error(n)}this._endTask(e);const i=this._nextTask.get(e);i&&(this._nextTask.delete(e),i())}addDisposer(s,e=this.genUID()){return this.add((()=>s),e)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){this._isRunning.has(s)?this._nextTask.set(s,(()=>this._flush(s))):this._flush(s)}async _flush(s){const e=this.remove(s);if(e){this._startTask(s);try{await e()}catch(i){console.error(i)}this._endTask(s)}const t=this._nextTask.get(s);t&&(this._nextTask.delete(s),t())}flushAll(){this.disposers.forEach(((s,e)=>this.flush(e)))}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}_startTask(s){this._isRunning.add(s),this._resolveFinished||(this.finished=new Promise((s=>{this._resolveFinished=s})))}_endTask(s){this._isRunning.delete(s),this._resolveFinished&&this._isRunning.size<=0&&this._nextTask.size<=0&&(this._resolveFinished(),this._resolveFinished=void 0)}},exports.SideEffectManager=class{constructor(){this.disposers=new Map}addDisposer(s,e=this.genUID()){return this.flush(e),this.disposers.set(e,Array.isArray(s)?()=>s.forEach(r):s),e}add(s,e=this.genUID()){const t=s();return t?this.addDisposer(t,e):e}addEventListener(s,e,t,i,r=this.genUID()){return s.addEventListener(e,t,i),this.addDisposer((()=>s.removeEventListener(e,t,i)),r),r}setTimeout(s,e,t=this.genUID()){const i=window.setTimeout((()=>{this.remove(t),s()}),e);return this.addDisposer((()=>window.clearTimeout(i)),t)}setInterval(s,e,t=this.genUID()){const i=window.setInterval(s,e);return this.addDisposer((()=>window.clearInterval(i)),t)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){const e=this.remove(s);if(e)try{e()}catch(t){console.error(t)}}flushAll(){this.disposers.forEach(r),this.disposers.clear()}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}},exports.genUID=i; | ||
//# sourceMappingURL=side-effect-manager.cjs.js.map |
@@ -12,7 +12,7 @@ export declare type SideEffectDisposer = () => any; | ||
* Add a side effect. | ||
* @param executor executes side effect, returns a disposer or a list of disposers | ||
* @param executor Executes side effect. Return a disposer or a list of disposers. Returns null or false to ignore. | ||
* @param disposerID Optional id for the disposer | ||
* @returns disposerID | ||
*/ | ||
add(executor: () => SideEffectDisposer | SideEffectDisposer[], disposerID?: string): string; | ||
add(executor: () => SideEffectDisposer | SideEffectDisposer[] | null | false, disposerID?: string): string; | ||
/** | ||
@@ -19,0 +19,0 @@ * Sugar for addEventListener. |
@@ -1,2 +0,2 @@ | ||
const s="!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e=s.length,t=Array(20),i=()=>{for(let i=0;i<20;i++)t[i]=s.charAt(Math.random()*e);return t.join("")};function r(s){try{return s()}catch(e){console.error(e)}}class n{constructor(){this.disposers=new Map}addDisposer(s,e=this.genUID()){return this.flush(e),this.disposers.set(e,Array.isArray(s)?()=>s.forEach(r):s),e}add(s,e=this.genUID()){return this.addDisposer(s(),e)}addEventListener(s,e,t,i,r=this.genUID()){return s.addEventListener(e,t,i),this.addDisposer((()=>s.removeEventListener(e,t,i)),r),r}setTimeout(s,e,t=this.genUID()){const i=window.setTimeout((()=>{this.remove(t),s()}),e);return this.addDisposer((()=>window.clearTimeout(i)),t)}setInterval(s,e,t=this.genUID()){const i=window.setInterval(s,e);return this.addDisposer((()=>window.clearInterval(i)),t)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){const e=this.remove(s);if(e)try{e()}catch(t){console.error(t)}}flushAll(){this.disposers.forEach(r),this.disposers.clear()}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}}class h{constructor(){this.finished=Promise.resolve(),this.disposers=new Map,this._nextTask=new Map,this._isRunning=new Set}add(s,e=this.genUID()){return this._isRunning.has(e)?this._nextTask.set(e,(()=>this._add(s,e))):this._add(s,e),e}async _add(s,e){this._startTask(e);const t=this.remove(e);if(t)try{await t()}catch(n){console.error(n)}try{const t=await s();this.disposers.set(e,Array.isArray(t)?async()=>Promise.all(t.map(r)):t)}catch(n){console.error(n)}this._endTask(e);const i=this._nextTask.get(e);i&&(this._nextTask.delete(e),i())}addDisposer(s,e=this.genUID()){return this.add((()=>s),e)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){this._isRunning.has(s)?this._nextTask.set(s,(()=>this._flush(s))):this._flush(s)}async _flush(s){const e=this.remove(s);if(e){this._startTask(s);try{await e()}catch(i){console.error(i)}this._endTask(s)}const t=this._nextTask.get(s);t&&(this._nextTask.delete(s),t())}flushAll(){this.disposers.forEach(((s,e)=>this.flush(e)))}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}_startTask(s){this._isRunning.add(s),this._resolveFinished||(this.finished=new Promise((s=>{this._resolveFinished=s})))}_endTask(s){this._isRunning.delete(s),this._resolveFinished&&this._isRunning.size<=0&&this._nextTask.size<=0&&(this._resolveFinished(),this._resolveFinished=void 0)}}export{h as AsyncSideEffectManager,n as SideEffectManager,i as genUID}; | ||
const s="!#%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e=s.length,t=Array(20),i=()=>{for(let i=0;i<20;i++)t[i]=s.charAt(Math.random()*e);return t.join("")};function r(s){try{return s()}catch(e){console.error(e)}}class n{constructor(){this.disposers=new Map}addDisposer(s,e=this.genUID()){return this.flush(e),this.disposers.set(e,Array.isArray(s)?()=>s.forEach(r):s),e}add(s,e=this.genUID()){const t=s();return t?this.addDisposer(t,e):e}addEventListener(s,e,t,i,r=this.genUID()){return s.addEventListener(e,t,i),this.addDisposer((()=>s.removeEventListener(e,t,i)),r),r}setTimeout(s,e,t=this.genUID()){const i=window.setTimeout((()=>{this.remove(t),s()}),e);return this.addDisposer((()=>window.clearTimeout(i)),t)}setInterval(s,e,t=this.genUID()){const i=window.setInterval(s,e);return this.addDisposer((()=>window.clearInterval(i)),t)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){const e=this.remove(s);if(e)try{e()}catch(t){console.error(t)}}flushAll(){this.disposers.forEach(r),this.disposers.clear()}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}}class h{constructor(){this.finished=Promise.resolve(),this.disposers=new Map,this._nextTask=new Map,this._isRunning=new Set}add(s,e=this.genUID()){return this._isRunning.has(e)?this._nextTask.set(e,(()=>this._add(s,e))):this._add(s,e),e}async _add(s,e){this._startTask(e);const t=this.remove(e);if(t)try{await t()}catch(n){console.error(n)}try{const t=await s();t&&this.disposers.set(e,Array.isArray(t)?async()=>Promise.all(t.map(r)):t)}catch(n){console.error(n)}this._endTask(e);const i=this._nextTask.get(e);i&&(this._nextTask.delete(e),i())}addDisposer(s,e=this.genUID()){return this.add((()=>s),e)}remove(s){const e=this.disposers.get(s);return this.disposers.delete(s),e}flush(s){this._isRunning.has(s)?this._nextTask.set(s,(()=>this._flush(s))):this._flush(s)}async _flush(s){const e=this.remove(s);if(e){this._startTask(s);try{await e()}catch(i){console.error(i)}this._endTask(s)}const t=this._nextTask.get(s);t&&(this._nextTask.delete(s),t())}flushAll(){this.disposers.forEach(((s,e)=>this.flush(e)))}genUID(){let s;do{s=i()}while(this.disposers.has(s));return s}_startTask(s){this._isRunning.add(s),this._resolveFinished||(this.finished=new Promise((s=>{this._resolveFinished=s})))}_endTask(s){this._isRunning.delete(s),this._resolveFinished&&this._isRunning.size<=0&&this._nextTask.size<=0&&(this._resolveFinished(),this._resolveFinished=void 0)}}export{h as AsyncSideEffectManager,n as SideEffectManager,i as genUID}; | ||
//# sourceMappingURL=side-effect-manager.es.js.map |
{ | ||
"name": "side-effect-manager", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"private": false, | ||
@@ -5,0 +5,0 @@ "description": "A tiny library to encapsulate side effects in a compact, reusable and testable style.", |
@@ -96,2 +96,23 @@ # side-effect-manager | ||
If the side effect returns a disposer function directly you can also: | ||
```js | ||
import Emittery from "emittery"; | ||
import { Remitter } from "remitter"; | ||
const emittery = new Emittery(); | ||
const remitter = new Remitter(); | ||
sideEffect.addDisposer( | ||
remitter.on("event1", eventData => console.log(eventData)) | ||
); | ||
// Or an array of disposers | ||
sideEffect.addDisposer([ | ||
remitter.on("event1", eventData => console.log(eventData)), | ||
remitter.on("event2", eventData => console.log(eventData)), | ||
emittery.on("event3", eventData => console.log(eventData)), | ||
]); | ||
``` | ||
There are also sugars for `addEventListener`, `setTimeout` and `setInterval`. | ||
@@ -98,0 +119,0 @@ |
@@ -9,3 +9,5 @@ import { genUID } from "./gen-uid"; | ||
| AsyncSideEffectDisposer | ||
| AsyncSideEffectDisposer[]; | ||
| AsyncSideEffectDisposer[] | ||
| null | ||
| false; | ||
@@ -15,3 +17,3 @@ export class AsyncSideEffectManager { | ||
* Add a side effect. | ||
* @param executor execute side effect | ||
* @param executor Execute side effect. Return a disposer or a disposer array. Return null or false to ignore. | ||
* @param disposerID Optional id for the disposer | ||
@@ -49,8 +51,10 @@ * @returns disposerID | ||
const disposers = await executor(); | ||
this.disposers.set( | ||
disposerID, | ||
Array.isArray(disposers) | ||
? async () => Promise.all(disposers.map(invoke)) | ||
: disposers | ||
); | ||
if (disposers) { | ||
this.disposers.set( | ||
disposerID, | ||
Array.isArray(disposers) | ||
? async () => Promise.all(disposers.map(invoke)) | ||
: disposers | ||
); | ||
} | ||
} catch (e) { | ||
@@ -57,0 +61,0 @@ console.error(e); |
@@ -27,3 +27,3 @@ import { genUID } from "./gen-uid"; | ||
* Add a side effect. | ||
* @param executor executes side effect, returns a disposer or a list of disposers | ||
* @param executor Executes side effect. Return a disposer or a list of disposers. Returns null or false to ignore. | ||
* @param disposerID Optional id for the disposer | ||
@@ -33,6 +33,7 @@ * @returns disposerID | ||
public add( | ||
executor: () => SideEffectDisposer | SideEffectDisposer[], | ||
executor: () => SideEffectDisposer | SideEffectDisposer[] | null | false, | ||
disposerID: string = this.genUID() | ||
): string { | ||
return this.addDisposer(executor(), disposerID); | ||
const disposers = executor(); | ||
return disposers ? this.addDisposer(disposers, disposerID) : disposerID; | ||
} | ||
@@ -39,0 +40,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
54922
495
193