import {ob} from "./ob.js" export type Requirement = (r: R) => T export type RequirementGroup = {[key: string]: Requirement} export type RequirementProvided> = ReturnType export type RequirementGroupProvided> = { [P in keyof G]: RequirementProvided } /** * establish a pattern for creating many things that have a common requirement. * - `const contextual = requirement()>` * - now you can use `contextual` as a template for creating things that require context * - `const MyView = contextual(context => flipview())` * - in that example, the requirement enforces the types for context and the view */ export function requirement() { return function(fun: Requirement) { return fun } } /** * provide a requirement to a group of things. */ requirement.provide = (r: R) => ( >(group: G) => ( ob(group).map(fun => fun(r)) as RequirementGroupProvided ) )