-
-
Notifications
You must be signed in to change notification settings - Fork 0
number in range
Nicholas Berlette edited this page Jun 19, 2025
·
1 revision
function inRange<
V extends number,
R extends Derange,
Min extends number = R extends [infer M extends number, number, Exclusivity?]
? M
: R[1] extends Exclusivity ? 0
: R[0],
Max extends number = R extends [number, infer M extends number, Exclusivity?]
? M
: R[1] extends Exclusivity ? R[0]
: R[1],
Tex extends Exclusivity = Either<
R extends [number, number, infer T extends Exclusivity] ? T
: R[1] extends Exclusivity ? R[1]
: undefined,
"[)"
>,
>(value: V, ...range: [...R] | Derange): value is InRange<V, Min, Max, Tex>;Checks if a given number is within a given range. The range can be specified in multiple ways:
- As a tuple with the minimum and maximum values, and optional exclusivity string of either "[]", "(]", "[)", or "()".
- As a tuple with a maximum value and an optional exclusivity string. This
assumes a minimum value of
0. - As a single number, which is assumed to be the maximum value, with an assumed
minimum value of
0and an assumed exclusivity string of "[]".
| Name | Info |
|---|---|
value |
The number to check. |
range |
The range to check against. |
true if the number is within the range, false otherwise.
Numbers
import { inRange } from "jsr:@nick/is/number/in_range";
console.log(inRange(1, 0, 2)); // true
console.log(inRange(1, 2, 0)); // false
console.log(inRange(1, 2)); // true
console.log(inRange(1, 2, "(]")); // truefunction inRange(value: number, ...range: Derange): value is InRange<number>;Checks if a given number is within a given range. The range can be specified in multiple ways:
- As a tuple with the minimum and maximum values, and optional exclusivity string of either "[]", "(]", "[)", or "()".
- As a tuple with a maximum value and an optional exclusivity string. This
assumes a minimum value of
0. - As a single number, which is assumed to be the maximum value, with an assumed
minimum value of
0and an assumed exclusivity string of "[]".
| Name | Info |
|---|---|
value |
The number to check. |
range |
The range to check against. |
true if the number is within the range, false otherwise.
Numbers
import { inRange } from "jsr:@nick/is/number/in_range";
console.log(inRange(1, 0, 2)); // true
console.log(inRange(1, 2, 0)); // false
console.log(inRange(1, 2)); // true
console.log(inRange(1, 2, "(]")); // truefunction inRange(value: number, ...range: any[]): undefined;function isExclusivity(it: unknown): it is Exclusivity;Checks if a given value is a valid range exclusivity string (either "[]", "(]", "[)", or "()").
| Name | Info |
|---|---|
it |
The value to check. |
true if the value is a valid range exclusivity string, false otherwise.
Numbers
import { isExclusivity } from "jsr:@nick/is/number/in_range";
console.log(isExclusivity("[]")); // true
console.log(isExclusivity("(]")); // true
console.log(isExclusivity("[)")); // true
console.log(isExclusivity("()")); // true
console.log(isExclusivity("")); // false
console.log(isExclusivity("[")); // false
console.log(isExclusivity("]")); // falseexport type AnyRange<Min extends number = number, Max extends number = number> =
| RangeInclusiveMin<Min, Max>
| RangeInclusive<Min, Max>
| RangeInclusiveMax<Min, Max>
| RangeExclusive<Min, Max>;-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number)
export type Derange =
| readonly [number, number, "[]"]
| readonly [number, "[]"]
| readonly [number, number, "[)"]
| readonly [number, "[)"]
| readonly [number, number, "(]"]
| readonly [number, "(]"]
| readonly [number, number, "()"]
| readonly [number, "()"]
| readonly [number, number, Exclusivity]
| readonly [number, Exclusivity];export type Exclusivity = AnyRange[2];export type InRange<
N extends number,
Min extends number = number,
Max extends number = number,
Tex extends Exclusivity = Exclusivity,
> =
& (number extends N ? IsInRange<Min, Max, Tex>
: `${Min}|${Max}` extends `-${number}|-${number}`
? `${N}` extends `-${number}` ? IsInRange<Min, Max, Tex> : never
: `${Min}|${Max}` extends `${number}|-${number}` ? never
: `${Min}|${Max}` extends `-${number}|${number}`
? `${N}` extends `-${number}` ? IsInRange<Min, Max, Tex> : never
: `${N}` extends `-${number}` ? never
: IsInRange<Min, Max, Tex>)
& N;Type-level equivalent to the inRange
function, which (naively) checks if a number is within a given range. The range
can be specified in multiple ways, with one of four different exclusivity types.
-
Nextendsnumber -
Minextendsnumber(default:number) -
Maxextendsnumber(default:number) -
TexextendsExclusivity(default:Exclusivity)
-
inRangefor more information.
export type Range<
Min extends number = number,
Max extends number = number,
Tex extends Exclusivity = never,
> = [Tex] extends [never] ?
| RangeInclusiveMin<Min, Max>
| RangeInclusive<Min, Max>
| RangeInclusiveMax<Min, Max>
| RangeExclusive<Min, Max>
| RangeUnknown<Min, Max>
: Either<
Extract<Range<Min, Max, never>, Required<RangeUnknown<Min, Max, Tex>>>,
RangeUnknown<Min, Max, Exclusivity>
>;-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number) -
TexextendsExclusivity(default:never)
export type RangeExclusive<
Min extends number = number,
Max extends number = number,
> = readonly [Min, Max, "()"] | readonly [Max, "()"];-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number)
export type RangeInclusive<
Min extends number = number,
Max extends number = number,
> = readonly [Min, Max, "[]"] | readonly [Max, "[]"];-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number)
export type RangeInclusiveMax<
Min extends number = number,
Max extends number = number,
> = readonly [Min, Max, "(]"] | readonly [Max, "(]"];-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number)
export type RangeInclusiveMin<
Min extends number = number,
Max extends number = number,
> = readonly [Min, Max, "[)"] | readonly [Max, "[)"];-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number)
export type RangeUnknown<
Min extends number = number,
Max extends number = number,
Tex extends Exclusivity = Exclusivity,
> = readonly [Min, Max, Tex] | readonly [Max, Tex];-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number) -
TexextendsExclusivity(default:Exclusivity)
-
Minextendsnumber(default:number) -
Maxextendsnumber(default:number) -
TexextendsExclusivity(default:Exclusivity)
readonly RANGE: readonly [Min,Max,Tex];