From 30f3ef2353569dc25aa42ba9eddd66d51750793a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 25 Aug 2025 23:06:44 +0200 Subject: [PATCH] Tests --- packages/effect-fc/src/types/Schema.ts | 121 +++++++------------------ 1 file changed, 31 insertions(+), 90 deletions(-) diff --git a/packages/effect-fc/src/types/Schema.ts b/packages/effect-fc/src/types/Schema.ts index f073117..d2ee2bb 100644 --- a/packages/effect-fc/src/types/Schema.ts +++ b/packages/effect-fc/src/types/Schema.ts @@ -1,4 +1,5 @@ import { Array, Function, Option, Predicate, Schema } from "effect" +import type { Simplify } from "effect/Types" type Prev = readonly [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] @@ -23,96 +24,36 @@ export type Paths = readonly [] | ( never ) -export type UnionPaths, D extends number, Seen> = { - [K in keyof T as K extends number ? K : never]: - | readonly [K] - | readonly [K, ...Paths] -} extends infer O - ? O[keyof O] - : never - -export type ArrayPaths = { - [K in keyof T as K extends number ? K : never]: - | readonly [K] - | readonly [K, ...Paths] -} extends infer O - ? O[keyof O] - : never - -export type ObjectPaths = { - [K in keyof T as K extends string | number | symbol ? K : never]-?: - NonNullable extends infer V - ? readonly [K] | readonly [K, ...Paths] - : never -} extends infer O - ? O[keyof O] - : never - -export type ValueFromPath = P extends [infer Head, ...infer Tail] - ? Head extends keyof T - ? ValueFromPath - : T extends readonly any[] - ? Head extends number - ? ValueFromPath - : never - : never - : T - -export type AnyPath = readonly PropertyKey[] - - -export const unsafeGet: { - >(path: P): (self: T) => ValueFromPath - >(self: T, path: P): ValueFromPath -} = Function.dual(2, >(self: T, path: P): ValueFromPath => - path.reduce((acc: any, key: any) => acc?.[key], self) -) - -export const get: { - >(path: P): (self: T) => Option.Option> - >(self: T, path: P): Option.Option> -} = Function.dual(2, >(self: 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(self), - ) -) - -export const immutableSet: { - >(path: P, value: ValueFromPath): (self: T) => ValueFromPath - >(self: T, path: P, value: ValueFromPath): Option.Option -} = Function.dual(3, >(self: T, path: P, value: ValueFromPath): Option.Option => { - const key = Array.head(path as AnyPath) - if (Option.isNone(key)) - return Option.some(value as T) - if (!Predicate.hasProperty(self, key.value)) - return Option.none() - - const child = immutableSet(self[key.value], Option.getOrThrow(Array.tail(path as AnyPath)), value) - if (Option.isNone(child)) - return child - - if (Array.isArray(self)) - return typeof key.value === "number" - ? Option.some([ - ...self.slice(0, key.value), - child.value, - ...self.slice(key.value + 1), - ] as T) - : Option.none() - - if (typeof self === "object") - return Option.some( - Object.assign( - Object.create(Object.getPrototypeOf(self)), - { ...self, [key.value]: child.value }, +export type SchemaFromPath = S extends Schema.Schema.Any + ? P extends [infer Head, ...infer Tail] + ? Head extends keyof S["Type"] + ? ( + S extends Schema.TupleType ? ( + Head extends keyof Elements ? SchemaFromPath : + Head extends keyof Rest ? SchemaFromPath : + never + ) : + S extends Schema.Array$ ? SchemaFromPath : + S extends Schema.Struct ? SchemaFromPath : + never ) - ) + : never + : S + : never - return Option.none() +const TestSchema = Schema.Struct({ + allUsers: Schema.Array(Schema.Struct({ + name: Schema.String + })), + + admins: Schema.Tuple( + Schema.Struct({ + name: Schema.Literal("Gneugneu") + }), + Schema.Struct({ + name: Schema.Literal("AAAAYA") + }), + ), }) +type S = SchemaFromPath +type T = number extends keyof typeof TestSchema.fields.admins.elements ? true : false