import { type Collection, type Path } from '../../types'; export type ExtractFromObject, K> = K extends keyof O ? O[K] : K extends keyof NonNullable ? NonNullable[K] : never; export type ExtractFromArray = any[] extends A ? A extends readonly (infer T)[] ? T | undefined : undefined : K extends keyof A ? A[K] : undefined; export type ExtractFromCollection = K extends [] ? O : K extends [infer Key, ...infer Rest] ? O extends Record ? ExtractFromCollection, Rest> : O extends readonly any[] ? ExtractFromCollection, Rest> : never : never; type Get = ExtractFromCollection>; export function get(obj: O, path: K) { return path.split('.').reduce((acc, key) => (acc as any)?.[key], obj) as Get | undefined; }