UNPKG

@agnos-ui/core

Version:

Framework-agnostic headless component library.

120 lines (119 loc) 3.41 kB
import { derived, computed, equal, readable, writable, asReadable } from "@amadeus-it-group/tansu"; import { noop } from "./utils/func.js"; const promisePending = { status: "pending" }; const isThenable = (value) => { const type = typeof value; return type === "object" && value !== null || type === "function" ? typeof value.then === "function" : false; }; const createPromiseStateStore = (promise) => { const store = writable(promisePending); Promise.resolve(promise).then( (value) => store.set({ status: "fulfilled", value }), (reason) => store.set({ status: "rejected", reason }) ); return asReadable(store); }; const promiseWeakMap = /* @__PURE__ */ new WeakMap(); const promiseStateStore = (value) => { if (!isThenable(value)) { return readable({ status: "fulfilled", value }); } let response = promiseWeakMap.get(value); if (!response) { response = createPromiseStateStore(value); promiseWeakMap.set(value, response); } return response; }; const promiseStateStoreEqual = (a, b) => Object.is(a, b) || a.status === b.status && (a.status !== "fulfilled" || equal(a.value, b.value)) && (a.status !== "rejected" || equal(a.reason, b.reason)); const promiseStoreToPromiseStateStore = (promiseStore$) => computed(() => promiseStateStore(promiseStore$())(), { equal: promiseStateStoreEqual }); const promiseStateStoreToValueStore = (store$, initialValue, equal2) => derived( store$, { derive: (state, set) => { if (state.status === "fulfilled") { set(state.value); } }, equal: equal2 }, initialValue ); const promiseStoreToValueStore = (promiseStore$, initialValue, equal2) => promiseStateStoreToValueStore(promiseStoreToPromiseStateStore(promiseStore$), initialValue, equal2); const truthyValue = (value) => !!value; const promiseFromStore = (store, condition = truthyValue) => { let resolve; const promise = new Promise((r) => resolve = r); let unsubscribe = () => { storeUnsubscribe(); unsubscribe = noop; }; let storeUnsubscribe = noop; storeUnsubscribe = store.subscribe((value) => { if (condition(value)) { resolve(value); unsubscribe(); } }); if (unsubscribe === noop) { storeUnsubscribe(); } return { promise, unsubscribe() { unsubscribe(); } }; }; const promiseFromEvent = (element, event) => { let resolve; const promise = new Promise((r) => resolve = r); let unsubscribe = () => { element.removeEventListener(event, eventListener); unsubscribe = noop; }; const eventListener = (event2) => { if (event2.target === element) { resolve(event2); unsubscribe(); } }; element.addEventListener(event, eventListener); return { promise, unsubscribe() { unsubscribe(); } }; }; const promiseFromTimeout = (delay) => { let timeout; return { promise: new Promise((r) => { timeout = setTimeout(() => { timeout = void 0; r(); }, delay); }), unsubscribe() { if (timeout) { clearTimeout(timeout); timeout = void 0; } } }; }; const promiseWithResolve = () => { let resolve; const promise = new Promise((r) => { resolve = r; }); return { promise, resolve }; }; export { promiseFromEvent as a, promiseFromTimeout as b, promiseWithResolve as c, promiseFromStore as d, promiseStoreToValueStore as p };