import { self, Param, Output, Key, PathItem, Fn, Indexable } from './types'; import { Next } from './utils'; import { Type, apply } from 'free-types-core'; export { ModifyPath }; type ModifyPath = I extends Output ? Data extends Fn ? (...args: Parameters) => V : never : I extends Param ? Data extends Fn ? (...args: SetIndex>) => ReturnType : never : I extends number ? Data extends unknown[] ? SetIndex : never : I extends Key ? Data extends Indexable ? { [K in keyof Data as FilteredKeys]: K extends I | `${I & string}` ? V : Data[K]; } : never : I extends self ? V : I extends Type ? V extends unknown[] ? apply : never : never; type SetIndex = number extends T['length'] ? T : I extends T['length'] ? R : SetIndex, [ ...R, I extends A ? V : T[I] ]>; type FilteredKeys = [ unknown ] extends [T[K]] ? string extends K ? never : number extends K ? never : symbol extends K ? never : K : K;