0.1.13 #18

Merged
Thilawyn merged 359 commits from next into master 2025-06-18 00:12:19 +02:00
2 changed files with 17 additions and 7 deletions
Showing only changes of commit dc46d03aab - Show all commits

View File

@@ -1,24 +1,26 @@
import { Array, Function, Option, Predicate } from "effect" import { Array, Function, Option, Predicate } from "effect"
import type { Includes } from "../utils.js"
export type Paths<T> = [] | ( export type Paths<T, Seen extends any[] = []> = [] | (
T extends readonly any[] ? ArrayPaths<T> : Includes<Seen, T> extends true ? [] :
T extends object ? ObjectPaths<T> : T extends readonly any[] ? ArrayPaths<T, [T, ...Seen]> :
T extends object ? ObjectPaths<T, [T, ...Seen]> :
never never
) )
export type ArrayPaths<T extends readonly any[]> = { export type ArrayPaths<T extends readonly any[], Seen extends any[]> = {
[K in keyof T as K extends number ? K : never]: [K in keyof T as K extends number ? K : never]:
| [K] | [K]
| [K, ...Paths<T[K]>] | [K, ...Paths<T[K], Seen>]
} extends infer O } extends infer O
? O[keyof O] ? O[keyof O]
: never : never
export type ObjectPaths<T extends object> = { export type ObjectPaths<T extends object, Seen extends any[]> = {
[K in keyof T as K extends string | number | symbol ? K : never]: [K in keyof T as K extends string | number | symbol ? K : never]:
| [K] | [K]
| [K, ...Paths<T[K]>] | [K, ...Paths<T[K], Seen>]
} extends infer O } extends infer O
? O[keyof O] ? O[keyof O]
: never : never

View File

@@ -9,3 +9,11 @@ export type CommonKeys<A, B> = Extract<keyof A, keyof B>
export type StaticType<T extends abstract new (...args: any) => any> = Omit<T, "prototype"> export type StaticType<T extends abstract new (...args: any) => any> = Omit<T, "prototype">
export type Merge<Super, Self> = Omit<Super, CommonKeys<Self, Super>> & Self export type Merge<Super, Self> = Omit<Super, CommonKeys<Self, Super>> & Self
export type Includes<T extends readonly any[], U> = (
T extends [infer Head, ...infer Tail]
? (<X>() => X extends Head ? 1 : 2) extends (<X>() => X extends U ? 1 : 2)
? true
: Includes<Tail, U>
: false
)