@benev/construct
Version:
game map editing suite for babylon
49 lines (37 loc) • 1.03 kB
text/typescript
import {ActionRecord} from "./action_record.js"
import {StateTree, ZipAction, ob} from "@benev/slate"
export function history_actualize<S, B extends ZipAction.Blueprint<S>>({
tree,
blueprint,
save_snapshot,
proceed,
}: {
tree: StateTree<S>
blueprint: B
save_snapshot: () => void
proceed: (action: ActionRecord) => void
}): ZipAction.Callable<B> {
let action_count = 1
function recurse(specs: ZipAction.Blueprint<S>, purpose: string[]): any {
return ob(specs).map((spec, name) => (
(typeof spec === "function")
? (...params: any[]) => {
const action = {
id: action_count++,
purpose: [...purpose, name as string],
params,
time: Date.now(),
} satisfies ActionRecord
tree.transmute(state => {
save_snapshot()
const setState = (newState: S) => { state = newState }
spec(state, setState)(...params)
return state
})
proceed(action)
}
: recurse(spec, [...purpose, name as string])
))
}
return recurse(blueprint, [])
}