import { ComponentType, FunctionComponent, ReactNode } from 'react'; export type Dakpan, I extends boolean> = [ FunctionComponent>, DakpanHook, DakpanHoc ]; export type DakpanHook> = (nullable?: T) => T extends false ? [S, MappedActions] : [S | undefined, MappedActions | undefined]; export type DakpanHoc> = ( map: (state: S, actions: MappedActions) => H ) =>

( component: ComponentType

) => ComponentType

; export type DakpanContext> = undefined | { state: S, actions: MappedActions }; export type ProviderProps = { children?: ReactNode } & (I extends true ? {} : { value: S, reinitialize?: boolean }); export type Actions = { [action: string]: (...args: any[]) => (state: S, get: () => S) => S | undefined | Promise }; export type MappedActions> = { [K in keyof A]: ((...args: Parameters) => Promise) & { c: (...args: Parameters) => () => Promise } }; export type InitialState = S | (() => S);