type-samurai
Version:
Advanced utility types for Typescript
46 lines (42 loc) • 1.43 kB
TypeScript
import { _Decrement } from "./decrement";
import { LastCharacter } from "./last-character";
import { Abs, IsNegative, Negate, ParseNumber } from "./number";
import { IsEmptyString } from "./string";
import { Stringify } from "./stringify";
type IncrementMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
type LastDigitMap = {
10: 0;
};
export type _Increment<
Number extends string,
Result extends string = ""
> = IsEmptyString<Number> extends true
? ParseNumber<`1${Result}`>
: LastCharacter<Number> extends `${infer LastDigit extends number}`
? IncrementMap[LastDigit] extends infer Incremented extends number
? Number extends `${infer Rest}${LastDigit}`
? Incremented extends keyof LastDigitMap
? _Increment<Rest, `${LastDigitMap[Incremented]}${Result}`>
: ParseNumber<`${Rest}${Incremented}${Result}`>
: never
: never
: never;
/**
* Accepts an integer and returns the incremented value of it. Range: `[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]`
* @example
* ```ts
* // 2
* type Case1 = Increment<1>
* // -9
* type Case1 = Increment<-10>
* ```
*/
export type Increment<T extends number> = IsNegative<T> extends true
? _Decrement<
Stringify<Abs<T>>
> extends infer NegativeIncrementResult extends number
? NegativeIncrementResult extends 0
? NegativeIncrementResult
: Negate<NegativeIncrementResult>
: never
: _Increment<Stringify<T>>;