Comparing version 0.0.1-alpha-7 to 0.0.1-alpha-8
@@ -51,2 +51,17 @@ type Resolver<T> = (payload: T) => any; | ||
interface ReadableState<T> { | ||
events: { | ||
changed: AwaitableEvent<T>; | ||
}; | ||
get: () => T; | ||
then: (resolver: Resolver<T>) => Promise<T>; | ||
} | ||
type FamilyState<T, Family extends Record<Id, T>, Id extends string = string> = ReadableState<Family> & { | ||
events: { | ||
changed: AwaitableEvent<Family>; | ||
}; | ||
getNode: (id: Id) => T; | ||
}; | ||
interface ReadableAsyncState<T> { | ||
@@ -66,21 +81,6 @@ events: { | ||
interface ReadableState<T> { | ||
events: { | ||
changed: AwaitableEvent<T>; | ||
}; | ||
get: () => T; | ||
then: (resolver: Resolver<T>) => Promise<T>; | ||
} | ||
type InferReadableType<T> = T extends ReadableAsyncState<infer U> ? U : T extends ReadableState<infer Q> ? Q : unknown; | ||
type Key = string; | ||
type FamilyState<T extends ReadableState<any> | ReadableAsyncState<any>> = ReadableState<Record<string, T>> & { | ||
events: { | ||
set: AwaitableEvent<T>; | ||
}; | ||
getNode: (id: Key) => T; | ||
set: (id: Key, value: T) => void; | ||
}; | ||
type Setter<T> = (nextValueOrResolver: T | ((current: T) => T)) => Promise<T>; | ||
type InferReadableType<T> = T extends ReadableAsyncState<infer U> ? U : T extends ReadableState<infer Q> ? Q : unknown; | ||
interface WritableAsyncState<T> { | ||
@@ -96,4 +96,2 @@ events: { | ||
type Setter<T> = (nextValueOrResolver: T | ((current: T) => T)) => Promise<T>; | ||
interface WritableState<T> { | ||
@@ -112,4 +110,9 @@ events: { | ||
declare const familyState: <T extends ReadableState<any> | ReadableAsyncState<any>>() => FamilyState<T>; | ||
type State<T> = ReadableState<T> & WritableState<T>; | ||
declare const state: <T>(initialValue: T) => State<T>; | ||
type Id$1 = string; | ||
declare const familyState: <T, Initializer extends (id: Id$1) => T | Promise<T>, NodeType extends ReturnType<Initializer> extends PromiseLike<T> ? AsyncState<T> : State<T>, Family extends Record<string, NodeType>>(initializer: Initializer) => FamilyState<NodeType, Family>; | ||
declare const scenario: (scenarioFn: () => Promise<any>) => Promise<never>; | ||
@@ -128,6 +131,2 @@ | ||
type State<T> = ReadableState<T> & WritableState<T>; | ||
declare const state: <T>(initialValue: T) => State<T>; | ||
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 }; |
@@ -159,2 +159,19 @@ 'use strict'; | ||
const scenario = async (scenarioFn) => { | ||
while (true) { | ||
await scenarioFn().catch(() => void 0); | ||
} | ||
}; | ||
const scenarioOnEvery = async (awaitableEvent, scenarioFn) => { | ||
while (true) { | ||
const event = await awaitableEvent; | ||
scenarioFn(event).catch(noop); | ||
} | ||
}; | ||
const scenarioOnce = (scenarioFn) => { | ||
scenarioFn().catch(noop); | ||
}; | ||
const state = (initialValue) => { | ||
@@ -186,50 +203,30 @@ let value = initialValue; | ||
const familyState = () => { | ||
const familyState = (initializer) => { | ||
const family = state({}); | ||
let mounted = true; | ||
const events = { | ||
changed: new AwaitableEvent(), | ||
set: new AwaitableEvent() | ||
changed: new AwaitableEvent() | ||
}; | ||
const getNode = (id) => { | ||
if (id in family.get()) { | ||
return family.get()[id]; | ||
} | ||
const initialValue = initializer(id); | ||
const nodeState = initialValue instanceof Promise ? asyncState(initialValue) : state(initialValue); | ||
family.set((current) => ({ ...current, [id]: nodeState })); | ||
events.changed.emit(family.get()); | ||
scenarioOnEvery(nodeState.events.changed, async () => { | ||
events.changed.emit(family.get()); | ||
}); | ||
return nodeState; | ||
}; | ||
const get = () => { | ||
return family.get(); | ||
}; | ||
const getNode = (id) => family.get()[id]; | ||
const set = (id, stateNode) => { | ||
family.set((current) => ({ ...current, [id]: stateNode })); | ||
events.set.emit(stateNode); | ||
}; | ||
const then = async (resolve) => { | ||
const result = await resolve(get()); | ||
const result = await resolve(family.get()); | ||
return result; | ||
}; | ||
(async () => { | ||
while (mounted) { | ||
await Promise.race([ | ||
events.set, | ||
...Object.values(family.get()).map((stateNode) => stateNode.events.changed) | ||
]); | ||
events.changed.emit(family.get()); | ||
} | ||
})(); | ||
return { events, get, getNode, set, then }; | ||
return { events, get, getNode, then }; | ||
}; | ||
const scenario = async (scenarioFn) => { | ||
while (true) { | ||
await scenarioFn().catch(() => void 0); | ||
} | ||
}; | ||
const scenarioOnEvery = async (awaitableEvent, scenarioFn) => { | ||
while (true) { | ||
const event = await awaitableEvent; | ||
scenarioFn(event).catch(noop); | ||
} | ||
}; | ||
const scenarioOnce = (scenarioFn) => { | ||
scenarioFn().catch(noop); | ||
}; | ||
const getCommonStatus = (states) => { | ||
@@ -236,0 +233,0 @@ const asyncStates = states.filter(isReadableAsyncState); |
{ | ||
"name": "awai", | ||
"version": "0.0.1-alpha-7", | ||
"version": "0.0.1-alpha-8", | ||
"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
77320
721