UNPKG

simple-pure-utils

Version:

Funciones puras para manipulación de objetos, arreglos, promesas y observables

106 lines 7.71 kB
import { isPromiseLike } from "./is"; /**Muy similar al @see Promise pero si el resolve se ejecuta inmediatamente la promesa se resuelve síncronamente * Esto permite obtener el valor de una promesa resuelta sincronamente con el @see syncPromiseValue * Puede convertir una promesa de javascript a un SyncPromise con el @see toSyncPromise, aunque no tendrá el comportamiento síncrono * * Para que una promesa sea sincrona desde su origen debe de ser creada de forma síncrona, ya sea construyendo esta clase o con los metodos para crear promesas como * @see synResolve @see syncFail @see splitPromise * * Note que @see delay(0) no devuelve una promesa síncrona */ export class SyncPromise { constructor(executor) { this.resolve = value => { if (isPromiseLike(value)) { value.then(this.resolve, this.reject); return; } this.syncResolve(value); }; this.syncResolve = (value) => { this.value = value; this.status = "resolved"; this.callListeners(); }; this.reject = reason => { this.error = reason; this.status = "error"; this.callListeners(); }; this.listeners = []; this.callListeners = () => { for (const l of this.listeners) l(); }; this.status = "pending"; this.callThenArg = (arg) => { if (this.status == "pending") throw new Error("Aun no se puede llamar a los thenArgs"); switch (this.status) { case "resolved": if (arg.onfulfilled) { return arg.onfulfilled(this.value); } return this.value; case "error": if (arg.onrejected) { return arg.onrejected(this.error); } return this.error; } }; executor(this.resolve, this.reject); } then(onfulfilled, onrejected) { switch (this.status) { case "pending": { const onF = onfulfilled; return new SyncPromise((resolve, reject) => { return this.listeners.push(() => { const value = this.callThenArg({ onfulfilled, onrejected }); if (this.status == "resolved" || onrejected) resolve(value); else { reject(value); } }); }); } case "resolved": { if (onfulfilled) { const ret = onfulfilled(this.value); if (isPromiseLike(ret)) { return ret; } else { return syncResolve(ret); } } return syncResolve(this.value); } case "error": { if (onrejected) { const ret = onrejected(this.error); if (isPromiseLike(ret)) return ret; else return syncResolve(ret); } debugger; return syncFail(this.error); } } } } export function syncResolve(x) { return new SyncPromise((resolve) => resolve(x)); } export function syncFail(reason) { return new SyncPromise((resolve, reject) => reject(reason)); } /**Una promesa que nunca se resuleve */ export const never = new Promise(() => { }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvbWlzZS9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3JDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBWSxRQUdIO1FBSVQsWUFBTyxHQUF5QyxLQUFLLENBQUMsRUFBRTtZQUNwRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsT0FBTzthQUNWO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFTSxnQkFBVyxHQUF3QixDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUE7UUFFRCxXQUFNLEdBQTJCLE1BQU0sQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUE7UUFFRCxjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUMvQixrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUNqQixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUMxQixDQUFDLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQTtRQUlELFdBQU0sR0FBcUMsU0FBUyxDQUFDO1FBRXJELGdCQUFXLEdBQUcs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