Comparing version 0.0.1-alpha-11 to 0.0.1-alpha-12
@@ -15,20 +15,2 @@ type Resolver<T> = (payload: T) => any; | ||
declare const rejectAfter: (ms: number) => Promise<void>; | ||
type Callback<A extends any[], R extends any> = (...args: A) => R; | ||
type BaseEvents<Args> = { | ||
invoked: AwaitableEvent<Args>; | ||
failed: AwaitableEvent<any>; | ||
}; | ||
type AsyncEvents<Args, Return> = BaseEvents<Args> & { | ||
completed: AwaitableEvent<Return>; | ||
}; | ||
declare function action<Args extends any[]>(): Function & { | ||
events: BaseEvents<Args>; | ||
}; | ||
declare function action<Args extends any[], Return extends any>(T: Callback<Args, Return>): Callback<Args, Return> & { | ||
events: AsyncEvents<Args, Return>; | ||
}; | ||
type AsyncSetter<T> = (nextValueOrResolver: T | Promise<T> | ((current?: T | undefined) => T | Promise<T>)) => void; | ||
@@ -101,2 +83,22 @@ | ||
declare const getAggregatedAsyncStatus: <T extends (ReadableState<any> | ReadableAsyncState<any>)[]>(states: T) => AsyncStatus; | ||
declare const rejectAfter: (ms: number) => Promise<void>; | ||
type Callback<A extends any[], R extends any> = (...args: A) => R; | ||
type BaseEvents<Args> = { | ||
invoked: AwaitableEvent<Args>; | ||
failed: AwaitableEvent<any>; | ||
}; | ||
type AsyncEvents<Args, Return> = BaseEvents<Args> & { | ||
completed: AwaitableEvent<Return>; | ||
}; | ||
declare function action<Args extends any[]>(): Function & { | ||
events: BaseEvents<Args>; | ||
}; | ||
declare function action<Args extends any[], Return extends any>(T: Callback<Args, Return>): Callback<Args, Return> & { | ||
events: AsyncEvents<Args, Return>; | ||
}; | ||
type InitialValue<T> = T | Promise<T> | (() => Promise<T>); | ||
@@ -107,2 +109,6 @@ type AsyncState<T> = ReadableAsyncState<T> & WritableAsyncState<T>; | ||
type CleanupCallback = () => void; | ||
declare const effect: <T extends any[], V extends { [K in keyof T]: InferReadableType<T[K]>; }>(states: [...T], effect: (...values: V) => CleanupCallback | void) => void; | ||
type State<T> = ReadableState<T> & WritableState<T>; | ||
@@ -128,2 +134,2 @@ | ||
export { AsyncSetter, AsyncState, AsyncStatus, AsyncValue, AwaitableEvent, FamilyState, InferReadableType, ReadableAsyncState, ReadableState, Setter, State, WritableAsyncState, WritableState, action, asyncState, delay, familyState, fork, isReadableAsyncState, rejectAfter, scenario, scenarioOnEvery, scenarioOnce, selector, state }; | ||
export { AsyncSetter, AsyncState, AsyncStatus, AsyncValue, AwaitableEvent, FamilyState, InferReadableType, ReadableAsyncState, ReadableState, Setter, State, WritableAsyncState, WritableState, action, asyncState, delay, effect, familyState, fork, getAggregatedAsyncStatus, isReadableAsyncState, rejectAfter, scenario, scenarioOnEvery, scenarioOnce, selector, state }; |
@@ -37,2 +37,4 @@ 'use strict'; | ||
const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); | ||
const fork = async (forkFn) => { | ||
@@ -42,2 +44,24 @@ await forkFn(); | ||
var AsyncStatus = /* @__PURE__ */ ((AsyncStatus2) => { | ||
AsyncStatus2["LOADING"] = "loading"; | ||
AsyncStatus2["LOADED"] = "loaded"; | ||
AsyncStatus2["FAILURE"] = "failure"; | ||
return AsyncStatus2; | ||
})(AsyncStatus || {}); | ||
const isReadableAsyncState = (value) => isObject(value) && isFunction(value.get) && isFunction(value.getAsync) && isFunction(value.getPromise) && isFunction(value.then); | ||
const getAggregatedAsyncStatus = (states) => { | ||
const asyncStates = states.filter(isReadableAsyncState); | ||
const hasError = asyncStates.find((state) => state.getStatus() === AsyncStatus.FAILURE); | ||
if (hasError) { | ||
return AsyncStatus.FAILURE; | ||
} | ||
const hasLoading = asyncStates.find((state) => state.getStatus() === AsyncStatus.LOADING); | ||
if (hasLoading) { | ||
return AsyncStatus.LOADING; | ||
} | ||
return AsyncStatus.LOADED; | ||
}; | ||
const isFunction = (value) => typeof value === "function"; | ||
@@ -81,11 +105,2 @@ | ||
var AsyncStatus = /* @__PURE__ */ ((AsyncStatus2) => { | ||
AsyncStatus2["LOADING"] = "loading"; | ||
AsyncStatus2["LOADED"] = "loaded"; | ||
AsyncStatus2["FAILURE"] = "failure"; | ||
return AsyncStatus2; | ||
})(AsyncStatus || {}); | ||
const isReadableAsyncState = (value) => isObject(value) && isFunction(value.get) && isFunction(value.getAsync) && isFunction(value.getPromise) && isFunction(value.then); | ||
const isPromiseOrFunction = (value) => isFunction(value) || isPromiseLike(value); | ||
@@ -138,2 +153,3 @@ const asyncState = (initialValue) => { | ||
} | ||
await flush(); | ||
}; | ||
@@ -180,2 +196,22 @@ const get = () => value; | ||
const effect = (states, effect2) => { | ||
let cleanup; | ||
const runEffect = () => { | ||
const values = states.map((state) => state.get()); | ||
const status = getAggregatedAsyncStatus(states); | ||
if (status !== AsyncStatus.LOADED) { | ||
return; | ||
} | ||
return effect2(...values); | ||
}; | ||
cleanup = runEffect(); | ||
scenario(async () => { | ||
await Promise.race(states.map((state) => state.events.changed)); | ||
if (isFunction(cleanup)) { | ||
cleanup(); | ||
} | ||
cleanup = runEffect(); | ||
}); | ||
}; | ||
const state = (initialValue) => { | ||
@@ -239,15 +275,2 @@ let value = initialValue; | ||
const getCommonStatus = (states) => { | ||
const asyncStates = states.filter(isReadableAsyncState); | ||
const hasError = asyncStates.find((state) => state.getStatus() === AsyncStatus.FAILURE); | ||
if (hasError) { | ||
return AsyncStatus.FAILURE; | ||
} | ||
const hasLoading = asyncStates.find((state) => state.getStatus() === AsyncStatus.LOADING); | ||
if (hasLoading) { | ||
return AsyncStatus.LOADING; | ||
} | ||
return AsyncStatus.LOADED; | ||
}; | ||
const asyncSelector = (states, predicate) => { | ||
@@ -263,3 +286,3 @@ let error; | ||
}; | ||
const getStatus = () => getCommonStatus(states); | ||
const getStatus = () => getAggregatedAsyncStatus(states); | ||
scenario(async () => { | ||
@@ -354,4 +377,6 @@ nextVersion++; | ||
exports.delay = delay; | ||
exports.effect = effect; | ||
exports.familyState = familyState; | ||
exports.fork = fork; | ||
exports.getAggregatedAsyncStatus = getAggregatedAsyncStatus; | ||
exports.isReadableAsyncState = isReadableAsyncState; | ||
@@ -358,0 +383,0 @@ exports.rejectAfter = rejectAfter; |
{ | ||
"name": "awai", | ||
"version": "0.0.1-alpha-11", | ||
"version": "0.0.1-alpha-12", | ||
"author": "Yuriy Yakym", | ||
@@ -5,0 +5,0 @@ "description": "State management library", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
88472
802