diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index ec4f762..e23d672 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,3 +1,6 @@ +import { Option, Predicate } from "effect" + + export type Paths = T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: @@ -26,9 +29,19 @@ const persons = [ ] -const getFromPath = >(value: T, path: P): ValueFromPath => ( - path.reduce((acc: any, key: any) => acc?.[key], value) +export const get = >(parent: T, path: P): Option.Option> => path.reduce( + (acc: Option.Option, key: any): Option.Option => Option.isSome(acc) + ? Predicate.hasProperty(acc.value, key) + ? Option.some(acc.value[key]) + : Option.none() + : acc, + + Option.some(parent), ) -const res = getFromPath(persons, [1, "name"]) +export const getOrUndefined = >(parent: T, path: P): ValueFromPath => ( + path.reduce((acc: any, key: any) => acc?.[key], parent) +) + +const res = get(persons, [1, "name"]) console.log(res)