Skip to content

Instantly share code, notes, and snippets.

@sanex3339
Created July 21, 2019 01:07
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 sanex3339/3ffebd0db1fbed6fdacbb1bcc74f4bf0 to your computer and use it in GitHub Desktop.
Save sanex3339/3ffebd0db1fbed6fdacbb1bcc74f4bf0 to your computer and use it in GitHub Desktop.
type PrependToArray <Element, TArray extends _Iterator<any, any[]> = []> =
((head: Element, ...args: TArray) => any) extends ((...args: infer TResult) => any)
? TResult
: TArray;
type ArrayLength <TArray extends _Iterator<any, any[]>> = TArray['length'];
type NextIteratorValue <TArray extends _Iterator<any, any[]>> = PrependToArray<any, TArray>;
type _Iterator<
Index extends number = 0,
Current extends any[] = []
> = {
0: _Iterator<Index, NextIteratorValue<Current>>,
1: Current,
}[
ArrayLength<Current> extends Index
? 1
: 0
];
type _NumberRange <
StartIterator extends _Iterator<Start, any>,
EndIterator extends _Iterator<End, any>,
StepIterator extends _Iterator<any, any>,
Start extends number,
End extends number,
Total extends number,
IndexIterator extends _Iterator<Start, any> = []
> = {
0: _NumberRange<
NextIteratorValue<StartIterator>,
EndIterator,
StepIterator,
Start,
End,
ArrayLength<StartIterator> | Total,
_Iterator<1>
>,
1: _NumberRange<
NextIteratorValue<StartIterator>,
EndIterator,
StepIterator,
Start,
End,
Total,
NextIteratorValue<IndexIterator>
>,
2: Total
}[
StartIterator extends EndIterator
? 2
: StepIterator extends IndexIterator
? 0
: 1
];
type NumberRange <
Start extends number = 0,
End extends number = 1,
Step extends number = 1,
Total extends number = Start
> = _NumberRange<_Iterator<Start>, _Iterator<End>, _Iterator<Step>, Start, End, Total>;
const foo: NumberRange<0, 40, 5> = 5;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment