import { StaticBackend } from "./static-backend"; type RecursiveComputable = { [K in keyof T]: T[K] extends object ? RecursiveComputable : T[K] | ((arg: Root) => T[K]); }; type Computable = RecursiveComputable; const makeComputable = (data: Computable, getRoot: () => Root): T => { if (typeof data !== "object") { return data; } return new Proxy(data, { get: (target: Computable, key_: string) => { const key = key_ as keyof Computable; const next = target[key]; if (typeof next === "function") { const root = getRoot(); return makeComputable(next(root), getRoot); } return makeComputable(next, getRoot); }, }) as T; }; export class ComputedBackend extends StaticBackend { constructor(data: Computable) { const computable: F = makeComputable(data, () => computable); super(computable); } }