import { self, Param, Output, Key, PathItem, Fn, Indexable } from './types.js'; import { HeadLength, IsArray, IsOpenEnded, Next, RestElement } from './utils.js'; import { _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 ? IsArray extends true ? SetElement : Data extends readonly unknown[] ? AsMutableAs extends true ? SetOpenEnded : 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: unknown; } ? V extends unknown[] ? _apply : never : never; type AsMutableAs = Model extends unknown[] ? T : Readonly; type Mutable = [...T]; type SetOpenEnded>> = number extends I ? [...Head, ...V[]] : [...SetIndex, ...RestElement[]]; type HeadOf = R['length'] extends N ? R : HeadOf; type SetElement = Data extends unknown[] ? V[] : Data extends readonly unknown[] ? readonly V[] : 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;