import { Length } from '../../array/Length'; import { Push } from '../../array/Push'; import { Extends } from '../../commonness/Extends'; import { If } from '../../commonness/If'; import { GreaterThan } from '../../number/GreaterThan'; import { Tuple } from '../../primitive/Tuple'; import { ToNumber } from '../../string/ToNumber'; type IsZeroOrNegative = If, 0, If, ToNumber<`-${T}`>, never>>; type PositiveRange = Length extends H ? Result | Length : Length extends L ? PositiveRange, true, Length> : Flag extends true ? PositiveRange, Flag, Result | Length> : PositiveRange, Flag, Result>; type NegativeRange = Length extends H ? Result | IsZeroOrNegative> : Length extends L ? NegativeRange, true, IsZeroOrNegative>> : Flag extends true ? NegativeRange, Flag, Result | IsZeroOrNegative>> : NegativeRange, Flag, Result>; /** * * Create a union of numbers in a given range * * 주어진 범위의 숫자 유니온을 생성 * * @param L Start of the range / 범위의 시작 * * @param H End of the range / 범위의 끝 * * @param Result Result to return / 반환할 결과 * * @example * type cases = [ * Expect, 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9>>, * Expect, 0 | 1 | 2>>, * Expect, 0>>, * Expect, -5 | -4 | -3 | -2 | -1 | 0>>, * Expect, never>>, * Expect, -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5>>, * Expect, never>>, * ]; * * @link https://www.utilscript.site/docs/usage-union/range * */ export type Range = If, H, `${L}` extends `-${infer R extends number}` ? `${H}` extends `-${infer S extends number}` ? If, NegativeRange, never> : NegativeRange<0, R> | PositiveRange<1, H> : If, never, If, never, PositiveRange>>>; export {};