/** * Get the absolute value of a numeric literal * * @param N - The number to get the absolute value of. * @returns N as a positive number. * * @public */ export declare type Abs = (N extends N ? `${N}` extends `-${infer M extends number}` ? M : N : never); /** * Add two numeric type literals. * * @param X - The first operand. * @param Y - The second operand. * @returns X + Y * * @public */ export declare type Add = (SomeElementExtends<[X, Y], never> extends 1 ? never : X extends 0 ? Y : Y extends 0 ? X : number extends (X | Y) ? number : AddNumbers); declare type AdditionTable = MakeAdditionTable<[FirstAdditiveResultRow]>; declare type AdditiveOperationResult = OperationResult; declare type AdditiveOperationTable = AdditiveOperationResult[][]; /** * Add two numeric type literals * * @internal */ declare type AddNumbers = SignedFloatToNum, ToSignedFloat>>; declare type AddSignedFloats = (X extends SignedFloat ? Y extends SignedFloat ? { '-': { '-': SignedFloat<'-', AddUnsignedFloats>; '+': NegateSignedFloat>; }; '+': { '-': SubtractUnsignedFloats; '+': SignedFloat<'+', AddUnsignedFloats>; }; }[XSign][YSign] : never : never); declare type AddUnsignedFloats = (Normalise extends [...DigitsPair, infer TDecimalPlaces extends number] ? DigitsToUnsignedFloat, TDecimalPlaces> : never); declare type AddUnsignedInts = (NormaliseIntPartLengths extends DigitsPair ? DigitwiseAdd : never); /** * Perform an AND operation on two Bit literals. * * @param A - The first operand. * @param B - The second operand. * @returns Bit - (A & B) * * @public */ export declare type And = AndMap[A][B]; declare type AndMap = TwoBitMap<[0, 0, 0, 1]>; declare type ArrayOf = (A['length'] extends TLength ? A : ArrayOf); /** * Used to represent true or false, but can be used to key into objects/tuples. * * @public */ export declare type Bit = 0 | 1; declare type BitMap = { 0: TFalse; 1: TTrue; }; /** * Compare two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns (-1 | 0 | 1) - (-1 if X is less than Y, 1 if X is greater than Y, 0 if X === Y). * * @public */ export declare type Compare = (SomeElementExtends<[X, Y], never> extends 1 ? never : number extends (X | Y) ? ComparisonResult : X extends X ? Y extends Y ? _Compare : never : never); declare type _Compare = (SignDecisionBranch; '+': -1; }; '+': { '-': 1; '+': CompareNumberMagnitudes; }; }>); declare type CompareDecisionBranch = TMap[Compare]; declare type CompareDigits = (A extends B ? 0 : _CompareDigits); declare type _CompareDigits = (TOrderedDigits extends HeadDigitArray ? A extends TLastDigit ? 1 : B extends TLastDigit ? -1 : _CompareDigits : never); declare type CompareFloatMagnitudes = (Normalise extends [...DigitsPair, number] ? CompareMagnitudes : never); declare type CompareIntMagnitudes = (NormaliseIntPartLengths extends DigitsPair ? CompareMagnitudes : never); declare type CompareLengths = (A['length'] extends B['length'] ? 0 : A['length'] extends 0 ? -1 : B['length'] extends 0 ? 1 : CompareLengths, Head>); declare type CompareMagnitudes = (TNormalisedX extends TNormalisedY ? 0 : [TNormalisedX, TNormalisedY] extends [TailDigitArray, TailDigitArray] ? CompareDigits extends 0 ? CompareMagnitudes : CompareDigits : never); declare type _CompareMap = { [K in ComparisonResult]: unknown; }; declare type CompareNumberMagnitudes = (SplitAndNormalise extends [...DigitsPair, number] ? CompareMagnitudes : never); declare type ComparisonResult = -1 | 0 | 1; declare type CrossMultiply = (Y extends HeadDigitArray ? CrossMultiply, ...TShift ]>>> : TPrevRowResult); declare type DecomposeNum = (SeparateSign<`${S}`> extends [infer TSign extends Sign, infer M extends string] ? SplitIntAndFractionParts> extends NumComponents ? NumComponents, TrimTrailingZeros> : never : never); declare type Digit = OrderedDigits[number]; declare type DigitsPair = [TDigits1, TDigits2]; declare type DigitsToUnsignedFloat = (TFractionalDigits['length'] extends TDecimalPlaces ? MakeUnsignedFloat : X extends HeadDigitArray ? DigitsToUnsignedFloat : never); declare type DigitwiseAdd = DigitwiseAdditiveOp; declare type DigitwiseAdditiveOp = ([ X, Y ] extends [HeadDigitArray, HeadDigitArray] ? TTable[TCarryIn][A] extends AdditiveOperationResult ? TTable[B][AAndCarryIn] extends AdditiveOperationResult ? DigitwiseAdditiveOp, [TResult, ...TFinalResult]> : never : never : [TCarryIn, ...TFinalResult]); declare type DigitwiseSubtract = DigitwiseAdditiveOp; /** * Divide two numeric type literals. * * @param TNumerator - The numerator (a.k.a dividend) * @param TDivisor - The divisor (a.k.a denominator) * @returns TNumerator / TDivisor * * @public */ export declare type Divide = (SomeElementExtends<[TNumerator, TDivisor], never> extends 1 ? never : TDivisor extends 0 ? never : TNumerator extends 0 ? 0 : TDivisor extends 1 ? TNumerator : number extends (TNumerator | TDivisor) ? number : TDivisor extends -1 ? Negate : DivideNumbers); declare type DivideMaxDigits = 13; declare type DivideNumbers = SignedFloatToNum, ToSignedFloat>>; declare type DivideSignedFloats = (TNumerator extends SignedFloat ? TDivisor extends SignedFloat ? SignedFloat, DivideUnsignedFloats[0]> : never : never); declare type DivideUnsignedFloats = (Normalise extends [...DigitsPair, infer TDecimalPlaces] ? N extends TailDigitArray ? [ LongDivide, TDecimalPlaces ] : never : never); declare type EmptryStringAsZero = S extends '' ? '0' : S; /** * Perform an equality comparison on two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns Bit - (1 if X \< Y, 0 if X \>= Y). * * @public */ export declare type Eq = (SomeElementExtends<[X, Y], never> extends 1 ? never : number extends (X | Y) ? Bit : X extends Y ? Y extends X ? 1 : 0 : 0); declare type EuclideanDivide = _EuclideanDivide; declare type _EuclideanDivide = (CompareIntMagnitudes extends (1 | 0) ? _EuclideanDivide, AddUnsignedInts> : MakeModResult); declare type EuclideanDivideResult = ModResult; declare type Exponentiate = (N extends 0 ? 1 : IsNegative extends 1 ? Exponentiate, Negate> : IsEven extends 1 ? Exponentiate, Divide> : Exponentiate, Divide, 2>> extends infer XX extends number ? Multiply : never); declare type FirstAdditiveResultRow = MakeFirstRow<[]>; declare type FlipSign = SignMap<'+', '-'>[S]; declare type FloatDigitCount = ([ ...TUnsignedFloat[0], ...TUnsignedFloat[1] ] extends infer TDigits extends Digit[] ? TDigits['length'] : never); declare type FloatMaxDigits = 16; declare type FloatMaxDigitsAsUnsignedFloat = ToUnsignedFloat; declare type FourBits = [Bit, Bit, Bit, Bit]; declare type GetSign = BitMap<'-', '+'>[IsPositive]; /** * Perform a 'greater than' comparison on two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns Bit - (1 if X \> Y, 0 if X \<= Y). * * @public */ export declare type Gt = (CompareDecisionBranch); /** * Perform a 'greater than or equal to' operation on two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns Bit - (1 if X \>= Y, 0 if X \< Y). * * @public */ export declare type GtOrEq = (CompareDecisionBranch); declare type Head = A extends [...infer THead, unknown] ? THead : never; declare type HeadDigitArray = [...THead, TLast]; declare type InferNum = (S extends '0' ? 0 : `${SignStr}${S}` extends `${infer N extends number}` ? N : never); /** * Checks if a numeric type literal is Even. * * @param N - The number to check. * @returns Bit - (i.e. 1 if N is Even, 0 if N is Odd. Returns never if N is has a non-zero fractional component). * * @public */ export declare type IsEven = (number extends N ? Bit : N extends N ? IsUnsignedFloatEven> : never); /** * Checks if a numeric type literal is an Integer. * * @param N - The number to check. * @returns Bit - (i.e. 1 if N is an Integer, 0 if N has a non-zero fractional component). * * @public */ export declare type IsInt = (number extends N ? Bit : N extends N ? `${N}` extends `${string}.${string}` ? 0 : 1 : never); declare type IsIntEven = (D extends HeadDigitArray ? TLastDigit extends (0 | 2 | 4 | 6 | 8) ? 1 : 0 : never); /** * Check if a numeric literal is negative. * * @param N - The number to check. * @returns Bit (i.e. 1 if N is negative, 0 if N is positive). * * @public */ export declare type IsNegative = Not>; /** * Checks if a numeric type literal is not an Integer. * * @param N - The number to check. * @returns Bit - (i.e. 1 if N has a non-zero fractional component, 0 if N is an Integer). * * @public */ export declare type IsNotInt = Not>; /** * Checks if a numeric type literal is Odd. * * @param N - The number to check. * @returns Bit - (i.e. 1 if N is Odd, 0 if N is Even. Returns never if N is has a non-zero fractional component). * * @public */ export declare type IsOdd = Not>; /** * Check if a numeric literal is positive. * * @param N - The number to check. * @returns Bit (i.e. 1 if N is positive, 0 if N is negative). * * @public */ export declare type IsPositive = (N extends N ? number extends N ? Bit : `${N}` extends `-${number}` ? 0 : 1 : never); declare type IsUnsignedFloatEven = (F[1] extends [] ? IsIntEven : never); declare type Join = (A extends [infer H extends Stringable, ...infer R extends Stringable[]] ? Join : S); declare type Last = A extends [...unknown[], infer TLast] ? TLast : never; declare type LeftPad = (A['length'] extends N ? A : LeftPad<[V, ...A], V, N>); declare type LeftTrimTuple = (A extends [infer H, ...infer R] ? [H] extends [T] ? LeftTrimTuple : A : A); declare type LongDivide = (EuclideanDivide extends EuclideanDivideResult ? [...TQuotient, TNextQuotientDigit] extends infer TNextQuotient extends Digit[] ? TNumeratorTail extends TailDigitArray ? LongDivide : TWithRemainder extends false ? MakeUnsignedFloat> : MakeModResult : never : never); declare type LongDivideFraction = (_Compare extends 1 ? TQuotient : EuclideanDivide extends EuclideanDivideResult ? TRemainder extends [0] ? [...TQuotient, TNextQuotientDigit] : LongDivideFraction : never); /** * Perform a 'less than' comparison on two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns Bit - (1 if X \< Y, 0 if X \>= Y). * * @public */ export declare type Lt = Gt; /** * Perform a 'less than or equal to' operation on two numeric type literals. * * @param X - The number on the "left". * @param Y - The number on the "right". * @returns Bit - (1 if X \<= Y, 0 if X \> Y). * * @public */ export declare type LtOrEq = GtOrEq; declare type MakeAdditionTable = (T['length'] extends 10 ? T : MakeAdditionTable<[...T, RotateLeftWithCarry>]>); declare type MakeFirstRow = (A['length'] extends Digit ? MakeFirstRow<[...A, AdditiveOperationResult<0, A['length']>]> : A); declare type MakeModResult = ModResult, NormaliseIntZeros>; declare type MakeMultiplicationRow = (TRow['length'] extends 10 ? TRow : Last extends infer TPrev extends number ? MakeMultiplicationRow]> : never); declare type MakeMultiplicationTable = (TTable['length'] extends 10 ? TTable : X extends TailDigitArray ? MakeMultiplicationTable<[...TTable, MapToOperationResult>], XTail> : never); declare type MakeSignedFloat = (MakeUnsignedFloat extends infer TActualUnsignedFloat extends UnsignedFloat ? TActualUnsignedFloat extends UnsignedFloatZero ? SignedFloatZero : SignedFloat : never); declare type MakeSubtractionTable = (T['length'] extends 10 ? T : MakeSubtractionTable<[...T, RotateRightWithCarry>]>); declare type MakeUnsignedFloat = (UnsignedFloat, NormaliseFractionalZeros>); declare type MapToOperationResult = { [K in keyof TRow]: OperationResultFromNum; }; /** * Get the greatest of two numeric type literals. * * @param X - The first operand. * @param Y - The second operand. * @returns X|Y - (X if X \> Y, Y if Y \> X else X (since they would be equal)). * * @public */ export declare type Max = (number extends (X | Y) ? number : X extends Y ? X : Y extends X ? Y : Gt extends 1 ? X : Y); /** * Get the smallest of two numeric type literals. * * @param X - The first operand. * @param Y - The second operand. * @returns X|Y - (X if X \< Y, Y if Y \< X else X (since they would be equal)). * * @public */ export declare type Min = (number extends (X | Y) ? number : X extends Y ? X : Y extends X ? Y : Lt extends 1 ? X : Y); /** * Mod two numeric type literals. This returns the remainder as per JavaScript's Remainder (%) operator. * * @param TNumerator - The numerator (a.k.a dividend) * @param TDivisor - The divisor (a.k.a denominator) * @returns TNumerator % TDivisor * * @public */ export declare type Mod = (SomeElementExtends<[TNumerator, TDivisor], never> extends 1 ? never : TDivisor extends 0 ? never : TNumerator extends 0 ? 0 : number extends (TNumerator | TDivisor) ? number : ModNumbers); declare type ModNumbers = SignedFloatToNum, ToSignedFloat>>; declare type ModResult = [ remainder: TRemainder, quotient: TQuotient ]; declare type ModSignedFloats = (TNumerator extends SignedFloat ? TDivisor extends SignedFloat ? SignedFloat> : never : never); declare type ModUnsignedFloats = (DivideUnsignedFloats extends [ModResult, infer TDecimalPlaces extends number] ? SafeDigitsToUnsignedFloat : never); declare type MultiplicationTable = MakeMultiplicationTable<[], OrderedDigits>; /** * Multiply two numeric type literals. * * @param X - The first operand. * @param Y - The second operand. * @returns X * Y * * @public */ export declare type Multiply = (SomeElementExtends<[X, Y], never> extends 1 ? never : X extends 0 ? 0 : Y extends 0 ? 0 : X extends 1 ? Y : Y extends 1 ? X : number extends (X | Y) ? number : X extends -1 ? Negate : Y extends -1 ? Negate : MultiplyNumbers); declare type MultiplyNumbers = SignedFloatToNum, ToSignedFloat>>; declare type MultiplyRow = (X extends HeadDigitArray ? MultiplicationTable[A][B] extends OperationResult ? AdditionTable[ATimesB][TCarryIn] extends AdditiveOperationResult ? AdditionTable[ATimesBCarryOut][TCarryOut2] extends AdditiveOperationResult<0, infer TFinalCarryOut> ? MultiplyRow : never : never : never : [TCarryIn, ...TFinalResult]); declare type MultiplySignedFloats = (X extends SignedFloat ? Y extends SignedFloat ? SignedFloat, MultiplyUnsignedFloats> : never : never); declare type MultiplySigns = SignMultiplicationMap[S][T]; declare type MultiplyUnsignedFloats = (NormaliseForCrossMultiply extends [...DigitsPair, infer TDecimalPlaces extends number] ? SafeDigitsToUnsignedFloat, TDecimalPlaces> : never); /** * Negate a numeric literal * * @param N - The number to negate. * @returns -N * * @public */ export declare type Negate = (N extends 0 ? 0 : number extends N ? number : `${N}` extends `-${infer M extends number}` ? M : `-${N}` extends `${infer M extends number}` ? M : never); declare type NegateSignedFloat = (X extends SignedFloat ? SignedFloat, TUnsignedFloat> : never); declare type Normalise = (NormaliseIntPartLengths extends DigitsPair ? NormaliseLengths extends DigitsPair ? [ xDigits: [...XIntegerPart, ...XFractionalPart], yDigits: [...YIntegerPart, ...YFractionalPart], decimalPlaces: YFractionalPart['length'] ] : never : never); declare type NormaliseForCrossMultiply = (X extends UnsignedFloat ? Y extends UnsignedFloat ? [ xDigits: NormaliseIntZeros<[...XIntegerPart, ...XFractionalPart]>, yDigits: NormaliseIntZeros<[...YIntegerPart, ...YFractionalPart]>, decimalPlaces: AddNumbers ] : never : never); declare type NormaliseFractionalZeros = RightTrimTuple; declare type NormaliseIntPartLengths = NormaliseLengths; declare type NormaliseIntZeros = (LeftTrimTuple extends infer TTrimmedX extends Digit[] ? TTrimmedX extends [] ? [0] : TTrimmedX : never); declare type NormaliseLengths = (CompareLengths extends 0 | -1 ? [Pad, B] : [A, Pad]); /** * Perform an NOT operation on a Bit literals. * * @param B - The operand to NOT. * @returns Bit - (~B) * * @public */ export declare type Not = NotMap[B]; declare type NotMap = BitMap<1, 0>; declare type NumComponents = [ sign: EmptryStringAsZero extends '0' ? '+' : TSign, integerPart: I, fractionalPart: F ]; declare type NumsUpto = (A['length'] extends N ? Reject : NumsUpto); declare type OperationResult = [carry: C, result: R]; declare type OperationResultFromNum = (`${N}` extends `${infer C extends Digit}${infer R extends Digit}` ? OperationResult : `${N}` extends `${infer R extends Digit}` ? OperationResult<0, R> : never); /** * Perform an OR operation on two Bit literals. * * @param A - The first operand. * @param B - The second operand. * @returns Bit - (A | B) * * @public */ export declare type Or = OrMap[A][B]; declare type OrderedDigits = NumsUpto<10>; declare type OrMap = TwoBitMap<[0, 1, 1, 1]>; declare type Pad = { 'L': LeftPad; 'R': RightPad; }[D]; declare type PadDirection = 'L' | 'R'; /** * Raise a numeric literal to the power of another. * * @param X - The base. * @param N - The exponent (a.k.a power). Must be an Integer. * @returns X^N * * @public */ export declare type Pow = (SomeElementExtends<[X, N], never> extends 1 ? never : N extends 0 ? 1 : N extends 1 ? X : X extends 1 ? 1 : X extends -1 ? number extends N ? -1 | 1 : PowRejectingFractionalExponent : X extends 0 ? IsNegative extends 1 ? never : 0 : number extends (X | N) ? number : PowRejectingFractionalExponent); declare type PowRejectingFractionalExponent = (IsInt extends 0 ? never : Exponentiate); declare type Reject = (A extends [infer H, ...infer R] ? [H] extends [T] ? Reject : [H, ...Reject] : []); declare type RightPad = (A['length'] extends N ? A : RightPad<[...A, V], V, N>); declare type RightTrimTuple = (A extends [...infer H, infer L] ? [L] extends [T] ? RightTrimTuple : A : A); declare type RotateLeftWithCarry = (A extends [AdditiveOperationResult, ...infer TTail] ? [...TTail, AdditiveOperationResult<1, R>] : never); declare type RotateRightWithCarry = (A extends [...infer THead, AdditiveOperationResult] ? [AdditiveOperationResult<1, R>, ...THead] : never); declare type RoundFloat = (SmallEnoughForScientificNotation extends 1 ? F : F extends SignedFloat ? _Compare, FloatMaxDigits> extends (-1 | 0) ? F : SubtractUnsignedFloats> extends SignedFloat ? TTargetFractionLengthSign extends '-' ? F : RoundFractionalDigits> extends [infer TCarryOut extends Digit, ...infer TRoundedFraction extends Digit[]] ? MakeSignedFloat, TRoundedFraction>> : never : never : never); declare type RoundFractionalDigits = (F extends HeadDigitArray ? FHead['length'] extends TTargetFractionLength ? TTargetFractionLength extends 0 ? [TRoundingMap[D]] : AddUnsignedInts : RoundFractionalDigits : never); declare type RoundingCarryMap = SignMap<[ ...ArrayOf<6, 0>, ...ArrayOf<4, 1> ], [ ...ArrayOf<5, 0>, ...ArrayOf<5, 1> ]>; declare type SafeDigitsToUnsignedFloat = (_Compare extends -1 ? DigitsToUnsignedFloat, TDecimalPlaces> : DigitsToUnsignedFloat); declare type ScientificNotationAsDecimal = (`${N}` extends `${infer TSignificand extends number}e-${infer TExp extends number}` ? SplitIntAndFractionParts extends NumComponents ? ArrayOf extends [infer TIntZero extends 0, ...infer TFractionZeros extends 0[]] ? Join<[TIntZero, '.', ...TFractionZeros, I, F]> : never : never : `${N}`); declare type SeparateSign = (S extends `-${infer N}` ? ['-', N] : ['+', S]); declare type Sign = '+' | '-'; declare type SignDecisionBranch> = TBranches[GetSign][GetSign]; declare type SignedFloat = [ sign: TSign, unsignedFloat: TUnsignedFloat ]; declare type SignedFloatToNum = (RoundFloat extends SignedFloat ? UnsignedFloatToNum : never); declare type SignedFloatZero = SignedFloat<'+', UnsignedFloatZero>; declare type SignMap = { '-': TNegative; '+': TPositive; }; declare type SignMultiplicationMap = SignMap, SignMap<'-', '+'>>; declare type SignStr = S extends '+' ? '' : S; declare type SmallEnoughForScientificNotation = (TFractionalDigits extends [0, 0, 0, 0, 0, 0, ...Digit[]] ? 1 : 0); declare type SomeElementExtends = (A extends [infer H, ...infer R] ? [H] extends [T] ? 1 : SomeElementExtends : 0); declare type SplitAndNormalise = Normalise[1], ToSignedFloat[1]>; declare type SplitIntAndFractionParts = (`${S}` extends `${infer I}.${infer F}` ? NumComponents : NumComponents); declare type SplitIntoDigits = (N extends '' ? [] : N extends `${infer D extends Digit}${infer R}` ? R extends '' ? [D] : R extends `${number}` ? [D, ...SplitIntoDigits] : never : never); declare type SplitLeadingElements = (A extends [infer H, ...infer R] ? [H] extends [T] ? SplitLeadingElements : [L, A] : [L, []]); declare type Stringable = string | number | bigint | boolean | null | undefined; /** * Perform subtraction on two numeric type literals. * * @param X - The first operand. * @param Y - The second operand. * @returns X - Y * * @public */ export declare type Subtract = (SomeElementExtends<[X, Y], never> extends 1 ? never : number extends (X | Y) ? number : X extends 0 ? Negate : Y extends 0 ? X : SubtractNumbers); declare type SubtractionTable = MakeSubtractionTable<[FirstAdditiveResultRow]>; declare type SubtractNumbers = SignedFloatToNum, ToSignedFloat>>; declare type SubtractSignedFloats = (X extends SignedFloat ? Y extends SignedFloat ? { '-': { '-': NegateSignedFloat>; '+': SignedFloat<'-', AddUnsignedFloats>; }; '+': { '-': SignedFloat<'+', AddUnsignedFloats>; '+': SubtractUnsignedFloats; }; }[XSign][YSign] : never : never); declare type SubtractUnsignedFloats = { 1: SignedFloat<'+', _SubtractUnsignedFloats>; 0: SignedFloatZero; [-1]: SignedFloat<'-', _SubtractUnsignedFloats>; }[CompareFloatMagnitudes]; declare type _SubtractUnsignedFloats = (Normalise extends [...DigitsPair, infer TDecimalPlaces extends number] ? DigitsToUnsignedFloat, TDecimalPlaces> : never); declare type SubtractUnsignedInts = (NormaliseIntPartLengths extends DigitsPair ? DigitwiseSubtract : never); declare type TailDigitArray = [TFirst, ...TTail]; declare type ToDecimalString = (TFractionalDigits extends [] ? Join : `${Join}.${Join}`); declare type ToSignedFloat = (DecomposeNum extends NumComponents ? SignedFloat, SplitIntoDigits>> : never); declare type ToSmallFractionString = (SmallEnoughForScientificNotation extends 1 ? SplitLeadingElements extends [infer TFractionalZeros extends 0[], infer TSignificand extends Digit[]] ? TSignificand extends TailDigitArray ? [0, ...TFractionalZeros]['length'] extends infer TExp extends number ? `${SignedFloatToNum>>}e-${TExp}` : never : never : never : ToDecimalString<[0], TFractionalDigits>); declare type ToUnsignedFloat = ToSignedFloat[1]; declare type Trim = ((L | R) extends '' ? S : '' extends (L | R) ? S extends `${L}${infer M}${R}` ? Trim : S : never); declare type TrimLeadingZeros = EmptryStringAsZero>; declare type TrimTrailingZeros = Trim; declare type TwoBitMap = BitMap, BitMap>; declare type UnsignedFloat = [ integerDigits: TIntegerDigits, fractionalDigits: TFractionalDigits ]; declare type UnsignedFloatToNum = (TUnsignedFloat extends UnsignedFloat ? TIntegerDigits extends [0] ? InferNum, TSign> : InferNum, TSign> : never); declare type UnsignedFloatZero = MakeUnsignedFloat<[0]>; /** * Perform an XOR (exclusive OR) operation on two Bit literals. * * @param A - The first operand. * @param B - The second operand. * @returns Bit - (A xor B) * * @public */ export declare type Xor = XorMap[A][B]; declare type XorMap = TwoBitMap<[0, 1, 1, 0]>; export { }