import { If_EmptyStr, Str } from '../string/string'; import { If_Never, Len, Type, TypeOf } from '../utils/utils'; import { MulMap, PlusMantissaMap, PlusOverBoolMap, SubMantissaMap, SubShrinkBoolMap } from './calc-table'; import { DecreaserStrNum, If_Gt, If_PositiveStrGte, If_PositiveStrLt, IncreaserStrNum } from './number'; type K = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; type If_BothFalse = A extends false ? (B extends false ? (true) : (false)) : (false); type PopLast = num extends `${infer before}${K}` ? (`${num}` extends `${before}${infer last}` ? last : def) : (def); type PopBefore = num extends `${infer before}${K}` ? (before extends "" ? def : before) : (def); type If_StrLenGt2 = 0 extends Len ? false : 1 extends Len ? false : true; export type PlusPositionStrNum = If_BothFalse extends true ? (num1 extends "1" ? (`1${result}`) : (num2 extends "1" ? `1${result}` : result)) : (PlusPositionStrNum & K][PopLast & K] extends true ? IncreaserStrNum> : PopBefore, PopBefore, `${PlusMantissaMap[PopLast & K][PopLast & K]}${result}`, If_StrLenGt2, If_StrLenGt2>); export type _DelLeftZero = num extends `0${infer after}` ? after extends "" ? "0" : _DelLeftZero : num; export type SubPositionStrNum = If_BothFalse extends true ? (_DelLeftZero) : (SubPositionStrNum & K][PopLast & K] extends true ? DecreaserStrNum> : PopBefore, PopBefore, `${SubMantissaMap[PopLast & K][PopLast & K]}${result}`, If_StrLenGt2, If_StrLenGt2>); type MulSingleStrNum = If_Never> extends true ? (over_num extends "0" ? result : `${over_num}${result}`) : (PlusPositionStrNum & K][single_num], over_num> extends infer curr_num extends string ? (MulSingleStrNum, single_num, `${PopLast}${result}`, PopBefore>) : (never)); export type MulPositionStrNum = If_Never> extends true ? (_DelLeftZero) : (MulPositionStrNum, PlusPositionStrNum>}${mantissa_zero}`>, `${mantissa_zero}0`>); type _FindMaxDivSingleStrNum = If_EmptyStr extends true ? ([ before, SubPositionStrNum ]) : (member extends `${infer curr}${infer rest}` ? (MulPositionStrNum extends infer ret extends string ? (ret extends num1 ? ([ curr, SubPositionStrNum ]) : (If_PositiveStrLt extends true ? (_FindMaxDivSingleStrNum) : ([ before, SubPositionStrNum ]))) : (never)) : (never)); type _SplitJoin = num extends `${infer curr}${infer rest}` ? ([ curr: curr, rest: rest, div_num: _DelLeftZero<`${value}${curr}`> ]) : ([ ]); export type DivPositionStrNum = _SplitJoin extends [infer curr extends string, infer rest extends string, infer curr_div_num extends string] ? (If_PositiveStrGte extends true ? (_FindMaxDivSingleStrNum extends [infer div_int extends string, infer rem_num extends string] ? (DivPositionStrNum) : (never)) : (DivPositionStrNum)) : (_DelLeftZero); export type RemPositionStrNum = _SplitJoin extends [infer curr extends string, infer rest extends string, infer curr_div_num extends string] ? (If_PositiveStrGte extends true ? (_FindMaxDivSingleStrNum extends [string, infer rem_num extends string] ? (RemPositionStrNum) : (never)) : (RemPositionStrNum)) : (result extends "" ? "0" : result); export type DivRemPositiveStrNum = _SplitJoin extends [infer curr extends string, infer rest extends string, infer curr_rem_num extends string] ? (If_PositiveStrGte extends true ? (_FindMaxDivSingleStrNum extends [infer div_int extends string, infer rem_num extends string] ? (DivRemPositiveStrNum) : (never)) : (DivRemPositiveStrNum)) : ([ int_num: _DelLeftZero, rem_num: rem_num ]); export type Plus> = PlusPositionStrNum, Str> extends `${infer R extends TargetType}` ? R : never; export type Sub> = If_Gt extends true ? (never) : (SubPositionStrNum, Str> extends `${infer R extends TargetType}` ? R : never); export type Mul> = MulPositionStrNum, Str> extends `${infer R extends TargetType}` ? R : never; export type Div> = DivPositionStrNum, Str> extends `${infer R extends TargetType}` ? R : never; export type Rem> = RemPositionStrNum, Str> extends `${infer R extends TargetType}` ? R : never; export type DivRem> = DivRemPositiveStrNum, Str> extends [infer I extends string | number | bigint, infer R extends string | number | bigint] ? [int_num: Type, rem_num: Type] : never; export type MulSum, result extends number = 1> = ns extends [infer first extends string | number, ...infer rest extends (string | number)[]] ? MulSum> : result; export {};