import { HydrationState } from "./hydration/index.ts"; export function createPipeline( skeletonFn: ( input: SkeletonFnInput, ) => Promise | Skeleton, hydrationFn: ( input: HydrationFnInput, ) => Promise, rulesFn: (input: RulesFnInput) => Skeleton, presentationFn: ( input: PresentationFnInput, ) => View, ) { return async (params: Params, ctx: Context) => { const skeleton = await skeletonFn({ ctx, params }); const hydration = await hydrationFn({ ctx, params, skeleton }); const appliedRules = rulesFn({ ctx, params, skeleton, hydration }); return presentationFn({ ctx, params, skeleton: appliedRules, hydration }); }; } export type SkeletonFnInput = { ctx: Context; params: Params; }; export type HydrationFnInput = { ctx: Context; params: Params; skeleton: Skeleton; }; export type RulesFnInput = { ctx: Context; params: Params; skeleton: Skeleton; hydration: HydrationState; }; export type PresentationFnInput = { ctx: Context; params: Params; skeleton: Skeleton; hydration: HydrationState; }; export function noRules(input: { skeleton: S }) { return input.skeleton; }