import { ControlGroup } from "../ControlTypings/ControlUtils"; import { AllControls, ControlsList, ConvertedControls, ReturnControls } from "../ControlTypings/Typing"; import { HKT, HKTApply } from "../HKT"; import { GetStoryProps, InferControlType, InferControls, StoryBase, StoryCleanup, StoryCreation, StoryInfo, } from "./Typing"; interface WithGeneric { use: "Generic"; } type GenericInfo = { __old: T; __new: T }; type InferInfosGroup = { [K in keyof T]: GenericInfo>; }; type InferControlInfos = { [K in keyof T]: T[K] extends ControlGroup ? InferInfosGroup : T[K] extends AllControls ? GenericInfo> : never; }; type SubscribeListener = ( values: InferControls, info: InferControlInfos, ) => void; type GenericProps = { controls: T extends ReturnControls ? InferControls : never; converted: ConvertedControls; subscribe: (listener: SubscribeListener) => StoryCleanup; }; type InferGenericProps = GetStoryProps>; interface GenericStoryCreationKey { render: StoryCreation; } type GenericStory = T & StoryBase & WithGeneric & GenericStoryCreationKey, StoryCleanup>; /* ---------------------------- GENERIC CREATOR ---------------------------- */ type InferCreatedControlGroup = { [K in keyof T]: HKTApply>; }; type InferCreatedControls = { [K in keyof T]: T[K] extends ControlGroup ? InferCreatedControlGroup : T[K] extends AllControls ? HKTApply> : never; };