import { AsyncState } from './AsyncState'; import { AsyncStatePhase } from './AsyncStatePhase'; export const loading = (): AsyncState => ({ phase: AsyncStatePhase.LOADING, value: undefined, error: undefined, }); export const updating = (value: T): AsyncState => ({ phase: AsyncStatePhase.UPDATING, value, error: undefined, }); export const resolved = (value: T): AsyncState => ({ phase: AsyncStatePhase.RESOLVED, value, error: undefined, }); export const rejected = (error: Error): AsyncState => ({ phase: AsyncStatePhase.REJECTED, value: undefined, error, }); export const reload = (prevState: AsyncState): AsyncState => { switch (prevState.phase) { case AsyncStatePhase.LOADING: return prevState; case AsyncStatePhase.UPDATING: case AsyncStatePhase.RESOLVED: return { phase: AsyncStatePhase.LOADING, value: prevState.value, error: undefined, }; case AsyncStatePhase.REJECTED: return { phase: AsyncStatePhase.LOADING, value: undefined, error: prevState.error, }; } }; export const update = (prevState: AsyncState): AsyncState => { switch (prevState.phase) { case AsyncStatePhase.LOADING: case AsyncStatePhase.UPDATING: return prevState; case AsyncStatePhase.RESOLVED: return { phase: AsyncStatePhase.UPDATING, value: prevState.value, error: undefined, }; case AsyncStatePhase.REJECTED: return { phase: AsyncStatePhase.LOADING, value: undefined, error: prevState.error, }; } }; export const resolve = (prevState: AsyncState, value: T): AsyncState => { switch (prevState.phase) { case AsyncStatePhase.LOADING: case AsyncStatePhase.UPDATING: return { phase: AsyncStatePhase.RESOLVED, value, error: undefined, }; case AsyncStatePhase.RESOLVED: case AsyncStatePhase.REJECTED: return prevState; } }; export const reject = (prevState: AsyncState, error: Error): AsyncState => { switch (prevState.phase) { case AsyncStatePhase.LOADING: case AsyncStatePhase.UPDATING: return { phase: AsyncStatePhase.REJECTED, value: undefined, error, }; case AsyncStatePhase.RESOLVED: case AsyncStatePhase.REJECTED: return prevState; } }; export const value = (state: AsyncState): T | undefined => state.value; export const error = (state: AsyncState): Error | undefined => state.error;