From 1163b83929692a22ab56fb246dcd6da692f6cd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 23 Apr 2025 05:53:19 +0200 Subject: [PATCH] SearchPaths work --- packages/reffuse/src/types/SearchPaths.ts | 50 ++++++++++++++--------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/packages/reffuse/src/types/SearchPaths.ts b/packages/reffuse/src/types/SearchPaths.ts index e3e8bf3..c49b20f 100644 --- a/packages/reffuse/src/types/SearchPaths.ts +++ b/packages/reffuse/src/types/SearchPaths.ts @@ -1,7 +1,10 @@ -import { Option, Predicate } from "effect" +import { Array, Option, Predicate } from "effect" -export type Paths = T extends object +export type Key = string | number | symbol +export type Path = readonly Key[] + +export type Paths = [] | (T extends object ? { [K in keyof T as K extends string | number | symbol ? K : never]: | [K] @@ -9,9 +12,9 @@ export type Paths = T extends object } extends infer O ? O[keyof O] : never - : [] + : never) -type ValueFromPath = P extends [infer Head, ...infer Tail] +export type ValueFromPath = P extends [infer Head, ...infer Tail] ? Head extends keyof T ? ValueFromPath : T extends readonly any[] @@ -22,13 +25,6 @@ type ValueFromPath = P extends [infer Head, ...infer Tail] : T -const persons = [ - { name: "Monsieur Poulet" }, - { name: "El Chanclador" }, - { name: "AAAYAYAYAYAAY" }, -] - - export const unsafeGet = >(parent: T, path: P): ValueFromPath => ( path.reduce((acc: any, key: any) => acc?.[key], parent) ) @@ -44,17 +40,31 @@ export const get = >(parent: T, path: P): Option.Opt ) -export const unsafeImmutableSet = >(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, +export const immutableSet = >( + parent: T, + path: P, + value: ValueFromPath, +): Option.Option => { + const key = Array.head(path as Path) + if (Option.isNone(key)) + return Option.some(value as T) + if (!Predicate.hasProperty(parent, key.value)) + return Option.none() - Option.some(parent), -) + const child = immutableSet(parent[key.value], Option.getOrThrow(Array.tail(path as Path)), value) + if (Array.isArray(parent) && typeof key === "number") { + + return Option.some([]) + } +} + + +const persons = [ + { name: "Monsieur Poulet" }, + { name: "El Chanclador" }, + { name: "AAAYAYAYAYAAY" }, +] const res = get(persons, [1, "name"]) - console.log(res)