import { If_FlexEqual, If_StrLenEq, If_StrLenGt, Not, Or, Str, Type, TypeOf } from '../'; import { Div, Mul, MulSum, Plus, Sub, _DelLeftZero } from './calc'; export * from "./calc"; export type ParseInt = `${T}` extends `${infer I extends Target}` ? I : never; export type If_PositiveNum = Str extends `-${infer I extends number}` ? false : true; export type If_NegativeNum = Not>; export type Abs> = `${T}` extends `-${infer I extends TargetType}` ? I : T; export type Negative> = Str extends "0" ? (Type<"0", TargetType>) : (Type extends `-${number}` ? T : `-${T}`, TargetType>); type IncreaserMap = { "0": "1"; "1": "2"; "2": "3"; "3": "4"; "4": "5"; "5": "6"; "6": "7"; "7": "8"; "8": "9"; "9": "0"; }; export type StrNumLiteral = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; export type IncreaserStrNum = T extends `${infer before}${StrNumLiteral}` ? (T extends `${before}${infer last extends StrNumLiteral}` ? (IncreaserStrNum) : (never)) : (mark extends true ? (result extends "" ? "" : `1${result}`) : (result)); export type Increaser> = IncreaserStrNum> extends `${infer S extends TargetType}` ? S : never; type DecreaserMap = { "0": "9"; "1": "0"; "2": "1"; "3": "2"; "4": "3"; "5": "4"; "6": "5"; "7": "6"; "8": "7"; "9": "8"; }; export type DecreaserStrNum = nstr extends `${infer before}${StrNumLiteral}` ? (nstr extends `${before}${infer last extends StrNumLiteral}` ? (DecreaserStrNum) : (never)) : (_DelLeftZero); export type Decreaser> = DecreaserStrNum> extends `${infer S extends TargetType}` ? S : never; type GtMap = { "0": { "0": false; "1": false; "2": false; "3": false; "4": false; "5": false; "6": false; "7": false; "8": false; "9": false; }; "1": { "0": true; "1": false; "2": false; "3": false; "4": false; "5": false; "6": false; "7": false; "8": false; "9": false; }; "2": { "0": true; "1": true; "2": false; "3": false; "4": false; "5": false; "6": false; "7": false; "8": false; "9": false; }; "3": { "0": true; "1": true; "2": true; "3": false; "4": false; "5": false; "6": false; "7": false; "8": false; "9": false; }; "4": { "0": true; "1": true; "2": true; "3": true; "4": false; "5": false; "6": false; "7": false; "8": false; "9": false; }; "5": { "0": true; "1": true; "2": true; "3": true; "4": true; "5": false; "6": false; "7": false; "8": false; "9": false; }; "6": { "0": true; "1": true; "2": true; "3": true; "4": true; "5": true; "6": false; "7": false; "8": false; "9": false; }; "7": { "0": true; "1": true; "2": true; "3": true; "4": true; "5": true; "6": true; "7": false; "8": false; "9": false; }; "8": { "0": true; "1": true; "2": true; "3": true; "4": true; "5": true; "6": true; "7": true; "8": false; "9": false; }; "9": { "0": true; "1": true; "2": true; "3": true; "4": true; "5": true; "6": true; "7": true; "8": true; "9": false; }; }; type If_PositiveStrGt = If_StrLenGt extends true ? (true) : (If_StrLenEq extends true ? (_If_PositiveStrGt) : (false)); type _If_PositiveStrGt = num1 extends `${infer curr1 extends StrNumLiteral}${infer after1}` ? (num2 extends `${infer curr2 extends StrNumLiteral}${infer after2}` ? (curr1 extends curr2 ? (_If_PositiveStrGt) : (GtMap[curr1][curr2])) : (never)) : (false); export type If_PositiveStrGte = Or | If_FlexEqual>; export type If_PositiveStrLt = If_PositiveStrGt; export type If_PositiveStrLte = Or | If_FlexEqual>; export type If_StrNumGt = If_NegativeNum extends true ? (If_NegativeNum extends true ? (If_PositiveStrLt, Abs>) : (false)) : (If_NegativeNum extends true ? (true) : (If_PositiveStrGt)); export type If_StrNumGte = Or | If_FlexEqual>; export type If_StrNumLt = If_StrNumGt; export type If_StrNumLte = Or | If_FlexEqual>; export type If_Gt = If_StrNumGt, Str>; export type If_Gte = If_StrNumGte, Str>; export type If_Lt = If_StrNumLt, Str>; export type If_Lte = If_StrNumLte, Str>; type NumPosInfo = count extends 0 ? ([ N extends "" ? 0 : ParseInt, ...result ]) : (N extends `${infer before}${StrNumLiteral}` ? (N extends `${before}${infer bit}` ? (NumPosInfo, [ParseInt, ...result]>) : (NumPosInfo, [0, ...result]>)) : (NumPosInfo, [0, ...result]>)); type _GetRangeCount = Div, step, string> extends infer int_num extends string ? (Increaser) : (never); type _Range_Hundred = If_Gt extends true ? never : _Range100; type _Range_Ten = If_Gt extends true ? never : _Range10; type _Range_Key_Num = Plus> extends infer n1 extends number ? (Plus> extends infer n2 extends number ? ([ n1, n2 ]) : (never)) : (never); export type Range = If_Gt extends true ? (never) : (NumPosInfo<_GetRangeCount> extends [infer hundred extends number, infer ten extends number, infer unit extends number] ? (_Range_Key_Num extends [infer n1 extends number, infer n2 extends number] ? ((hundred extends 0 ? never : _Range_Hundred, step>) | (ten extends 0 ? never : _Range_Ten, step>) | (unit extends 0 ? never : _Range1>>, step>)) : (never)) : (never)); type _Range1 = start extends end ? (result | end) : (_Range1, end, step, result | start>); type _Range10> = start extends end_next ? (result) : (_Range10>, end, step, result | start | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus>, end_next>); type _Range100> = start extends end_next ? (result) : (_Range100>, end, step, result | start | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus> | Plus>>);