Created
November 17, 2024 01:56
-
-
Save WomB0ComB0/a01a959bf18a7ea8d67fa4e5f923a836 to your computer and use it in GitHub Desktop.
ts-typed BFS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface Node<T = unknown, Nodes extends Node<any, any>[] = Node<any, any>[]> { | |
value: T; | |
neighbors: Nodes; | |
} | |
type A = Node<1, [B, C]> | |
type B = Node<2, [A, D]> | |
type C = Node<3, [A, B]> | |
type D = Node<4, [B, C]> | |
type FilterOut<Arr extends any[], Target> = | |
Arr extends [ | |
infer Head, | |
...infer Tail | |
] | |
? Head extends Target | |
? FilterOut<Tail, Target> | |
: [Head, ...FilterOut<Tail, Target>] | |
: []; | |
type BFS< | |
Root extends Node<any, any[]>, | |
ToFind, | |
Searched extends Node<any, any>[] = [] | |
> = Root extends (Searched['length'] extends 0 ? never : Searched[number]) | |
? FilterOut<Root['neighbors'], Searched[number]> extends [ | |
infer Current extends Node<any, any> | |
] | |
? BFS<Current, ToFind, [...Searched, Root]> | |
: never | |
: Root['value'] extends ToFind | |
? Root & { __order: Searched } | |
: Root['neighbors'] extends [ | |
infer Current extends Node<any, any>, | |
...infer Rest extends Node<any, any>[] | |
] | |
? Current['value'] extends ToFind | |
? Current | |
: Rest extends [infer Next extends Node<any, any>] | |
? BFS<Next, ToFind, [...Searched, Root]> | |
: never | |
: never; | |
type Result = BFS<A, 4> // Node<4, [Node<2>, Node<3>]> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment