0.1.13 #18
@@ -4,6 +4,7 @@ import { createFileRoute } from "@tanstack/react-router"
|
|||||||
import { GetRandomValues, makeUuid4 } from "@typed/id"
|
import { GetRandomValues, makeUuid4 } from "@typed/id"
|
||||||
import { Console, Effect, Option } from "effect"
|
import { Console, Effect, Option } from "effect"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
|
import { PropertyPath } from "reffuse/types"
|
||||||
|
|
||||||
|
|
||||||
interface Node {
|
interface Node {
|
||||||
@@ -11,6 +12,7 @@ interface Node {
|
|||||||
readonly left?: Node
|
readonly left?: Node
|
||||||
readonly right?: Node
|
readonly right?: Node
|
||||||
}
|
}
|
||||||
|
type NodePaths = PropertyPath.Paths<Node>
|
||||||
|
|
||||||
|
|
||||||
const makeUuid = Effect.provide(makeUuid4, GetRandomValues.CryptoRandom)
|
const makeUuid = Effect.provide(makeUuid4, GetRandomValues.CryptoRandom)
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
import { Array, Function, Option, Predicate } from "effect"
|
import { Array, Function, Option, Predicate } from "effect"
|
||||||
import type { Includes } from "../utils.js"
|
|
||||||
|
|
||||||
|
|
||||||
export type Paths<T, Seen extends any[] = []> = [] | (
|
export type Paths<T, Seen = never> = [] | (
|
||||||
Includes<Seen, T> extends true ? [] :
|
T extends Seen ? [] :
|
||||||
T extends readonly any[] ? ArrayPaths<T, [T, ...Seen]> :
|
T extends readonly any[] ? ArrayPaths<T, Seen | T> :
|
||||||
T extends object ? ObjectPaths<T, [T, ...Seen]> :
|
T extends object ? ObjectPaths<T, Seen | T> :
|
||||||
never
|
never
|
||||||
)
|
)
|
||||||
|
|
||||||
export type ArrayPaths<T extends readonly any[], Seen extends any[]> = {
|
export type ArrayPaths<T extends readonly any[], Seen> = {
|
||||||
[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], Seen>]
|
| [K, ...Paths<T[K], Seen>]
|
||||||
@@ -17,7 +16,7 @@ export type ArrayPaths<T extends readonly any[], Seen extends any[]> = {
|
|||||||
? O[keyof O]
|
? O[keyof O]
|
||||||
: never
|
: never
|
||||||
|
|
||||||
export type ObjectPaths<T extends object, Seen extends any[]> = {
|
export type ObjectPaths<T extends object, Seen> = {
|
||||||
[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], Seen>]
|
| [K, ...Paths<T[K], Seen>]
|
||||||
|
|||||||
@@ -9,9 +9,3 @@ 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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user