Skip to content

Instantly share code, notes, and snippets.

@antfu
Created August 2, 2020 03:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antfu/e2dc40e09bb1e8a263c471dd4901f8fa to your computer and use it in GitHub Desktop.
Save antfu/e2dc40e09bb1e8a263c471dd4901f8fa to your computer and use it in GitHub Desktop.
type Proxy = any[]
type Pop<T> = T extends [infer A, ...infer B] ? B : never
type Push<T> = T extends [...infer B] ? [any, ...B] : never
type Add<T extends Proxy, V extends Proxy> = [...T, ...V]
type Double<T extends Proxy> = [...T, ...T]
type Get<A extends Proxy> = A['length']
type AddOne<A extends Proxy> = Push<A>
type SubOne<A extends Proxy> = Pop<A>
type Zero = []
type InnerN<T extends number, V extends Proxy = Zero> = {
'true': V
'false': InnerN<T, AddOne<V>>
}[Get<V> extends T ? 'true' : 'false'];
type LIMIT = 1
type N<T extends number> = InnerN<T>;
type n1 = N<44>
type n2 = Double<n1>
type n3 = Double<n2>
type n4 = Double<n3>
type n5 = Double<n4>
type n6 = Double<n5>
type n7 = Double<n6>
type v = Get<n7>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment