import {ob} from "../../tools/ob.js" import {StateTree} from "../state_tree.js" export namespace ZipAction { export type Blueprint = {[key: string]: Blueprint | Fn} export type SetState = (state: S) => void export type Fn = ( (state: S, setState: (newState: S) => void) => (...params: P) => void ) export type Callable> = { [P in keyof B]: B[P] extends Blueprint ? Callable : B[P] extends Fn ? ReturnType : never } export function actualize>(tree: StateTree, blueprint: B) { return ob(blueprint).map(value => { if (typeof value === "function") { return (...params: any[]) => { tree.transmute(state => { const setState = (newState: S) => { state = newState } value(state, setState)(...params) return state }) } } else { return (actualize as any)(tree, value) } }) as Callable } export function fn() { return >(fn: F) => fn } export function blueprint() { return >(blueprint: B) => blueprint } export type Helpers = (state: S, setState: ZipAction.SetState) => H export const prepFn = ( helpers: Helpers ) =>

( fun: (helpers: H) => (...params: P) => void ): ZipAction.Fn => ( (state, setState) => (...params) => { fun(helpers(state, setState))(...params) return state } ) export const prepBlueprint = ( helpers: Helpers ) => >( makeBp: (action:

(f: (helpers: H) => (...params: P) => void) => Fn) => B ) => ( makeBp(prepFn(helpers)) ) export function prep(helpers: Helpers) { return { action: prepFn(helpers), blueprint: prepBlueprint(helpers), } } }