Skip to content

Commit

Permalink
feat(api): add Path0-8, PathVal1-8, DeepPath types
Browse files Browse the repository at this point in the history
  • Loading branch information
postspectacular committed Mar 24, 2020
1 parent 6df0110 commit 0c76108
Show file tree
Hide file tree
Showing 3 changed files with 218 additions and 5 deletions.
5 changes: 0 additions & 5 deletions packages/api/src/api/keyval.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import type { Head, Tail } from "./tuple";

/**
* Lookup path for nested data structures.
*/
export type Path = PropertyKey | PropertyKey[];

/**
* Extracts from A all keys which have values assignable to type B.
*/
Expand Down
217 changes: 217 additions & 0 deletions packages/api/src/api/path.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
import { NumOrString } from "./prim";
import type {
Keys,
Keys1,
Keys2,
Keys3,
Keys4,
Keys5,
Keys6,
Keys7,
Val1,
Val2,
Val3,
Val4,
Val5,
Val6,
Val7,
Val8,
} from "./keyval";

/**
* Lookup path for nested data structures.
*/
export type Path = PropertyKey | PropertyKey[];

export type Path0 = readonly [];

export type Path1<T, A> = A extends Keys<T> ? readonly [A] : never;

export type Path2<T, A, B> = A extends Keys<T>
? B extends Keys1<T, A>
? readonly [A, B]
: never
: never;

export type Path3<T, A, B, C> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? readonly [A, B, C]
: never
: never
: never;

export type Path4<T, A, B, C, D> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? readonly [A, B, C, D]
: never
: never
: never
: never;

export type Path5<T, A, B, C, D, E> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? readonly [A, B, C, D, E]
: never
: never
: never
: never
: never;

export type Path6<T, A, B, C, D, E, F> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? readonly [A, B, C, D, E, F]
: never
: never
: never
: never
: never
: never;

export type Path7<T, A, B, C, D, E, F, G> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? G extends Keys6<T, A, B, C, D, E, F>
? readonly [A, B, C, D, E, F, G]
: never
: never
: never
: never
: never
: never
: never;

export type Path8<T, A, B, C, D, E, F, G, H> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? G extends Keys6<T, A, B, C, D, E, F>
? H extends Keys7<T, A, B, C, D, E, F, G>
? readonly [A, B, C, D, E, F, G, H]
: never
: never
: never
: never
: never
: never
: never
: never;

// prettier-ignore
export type DeepPath<T, A, B, C, D, E, F, G, H> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? G extends Keys6<T, A, B, C, D, E, F>
? H extends Keys7<T, A, B, C, D, E, F, G>
? readonly [A, B, C, D, E, F, G, H, ...NumOrString[]]
: never
: never
: never
: never
: never
: never
: never
: never;

export type PathVal1<T, A> = A extends Keys<T> ? Val1<T, A> : never;

export type PathVal2<T, A, B> = A extends Keys<T>
? B extends Keys1<T, A>
? Val2<T, A, B>
: never
: never;

export type PathVal3<T, A, B, C> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? Val3<T, A, B, C>
: never
: never
: never;

export type PathVal4<T, A, B, C, D> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? Val4<T, A, B, C, D>
: never
: never
: never
: never;

export type PathVal5<T, A, B, C, D, E> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? Val5<T, A, B, C, D, E>
: never
: never
: never
: never
: never;

export type PathVal6<T, A, B, C, D, E, F> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? Val6<T, A, B, C, D, E, F>
: never
: never
: never
: never
: never
: never;

export type PathVal7<T, A, B, C, D, E, F, G> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? G extends Keys6<T, A, B, C, D, E, F>
? Val7<T, A, B, C, D, E, F, G>
: never
: never
: never
: never
: never
: never
: never;

export type PathVal8<T, A, B, C, D, E, F, G, H> = A extends Keys<T>
? B extends Keys1<T, A>
? C extends Keys2<T, A, B>
? D extends Keys3<T, A, B, C>
? E extends Keys4<T, A, B, C, D>
? F extends Keys5<T, A, B, C, D, E>
? G extends Keys6<T, A, B, C, D, E, F>
? H extends Keys7<T, A, B, C, D, E, F, G>
? Val8<T, A, B, C, D, E, F, G, H>
: never
: never
: never
: never
: never
: never
: never
: never;
1 change: 1 addition & 0 deletions packages/api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export * from "./api/logger";
export * from "./api/meta";
export * from "./api/null";
export * from "./api/object";
export * from "./api/path";
export * from "./api/predicate";
export * from "./api/prim";
export * from "./api/range";
Expand Down

0 comments on commit 0c76108

Please sign in to comment.