Skip to content

Instantly share code, notes, and snippets.

@Tsugami
Created June 13, 2022 21:33
Show Gist options
  • Save Tsugami/03e44250605477ed5c73e8cde4c15167 to your computer and use it in GitHub Desktop.
Save Tsugami/03e44250605477ed5c73e8cde4c15167 to your computer and use it in GitHub Desktop.
binary tree in typescript type system
type Equal<L, R> = L extends R ? true : false;
type GreaterThan<L, R, C extends number[] = []> = L extends R
? false
: C["length"] extends L
? false
: C["length"] extends R
? true
: GreaterThan<L, R, [...C, 1]>;
interface INode<V extends number | null, L, R> {
left: L;
right: R;
value: V;
}
type EmptyNode = INode<null, null, null>;
type N<V extends number, Node = EmptyNode> = Node extends EmptyNode | null
? INode<V, null, null>
: Node extends INode<infer NextV, infer L, infer R>
? Equal<V, NextV> extends true
? Node
: GreaterThan<V, NextV> extends true
? INode<NextV, N<V, L>, R>
: INode<NextV, L, N<V, R>>
: never;
type BinaryTree<T extends number[]> =
T extends [infer C, ...(infer R)]
? C extends number
? R extends []
? N<C>
: R extends number[]
? N<C, BinaryTree<R>>
:never
: never
: never
type B = BinaryTree<[10, 4, 3, 5, 4]> // INode<4, INode<5, INode<10, null, null>, null>, INode<3, null, null>>
type A = N<10, N<4, N<3, N<5, N<4>>>>>; // INode<4, INode<5, INode<10, null, null>, null>, INode<3, null, null>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment