You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.0 KiB
TypeScript
83 lines
2.0 KiB
TypeScript
6 months ago
|
import { toBrandedType } from "../excalidraw/utils";
|
||
|
import type { InclusiveRange } from "./types";
|
||
|
|
||
|
/**
|
||
|
* Create an inclusive range from the two numbers provided.
|
||
|
*
|
||
|
* @param start Start of the range
|
||
|
* @param end End of the range
|
||
|
* @returns
|
||
|
*/
|
||
|
export function rangeInclusive(start: number, end: number): InclusiveRange {
|
||
|
return toBrandedType<InclusiveRange>([start, end]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Turn a number pair into an inclusive range.
|
||
|
*
|
||
|
* @param pair The number pair to convert to an inclusive range
|
||
|
* @returns The new inclusive range
|
||
|
*/
|
||
|
export function rangeInclusiveFromPair(pair: [start: number, end: number]) {
|
||
|
return toBrandedType<InclusiveRange>(pair);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Given two ranges, return if the two ranges overlap with each other e.g.
|
||
|
* [1, 3] overlaps with [2, 4] while [1, 3] does not overlap with [4, 5].
|
||
|
*
|
||
|
* @param param0 One of the ranges to compare
|
||
|
* @param param1 The other range to compare against
|
||
|
* @returns TRUE if the ranges overlap
|
||
|
*/
|
||
|
export const rangesOverlap = (
|
||
|
[a0, a1]: InclusiveRange,
|
||
|
[b0, b1]: InclusiveRange,
|
||
|
): boolean => {
|
||
|
if (a0 <= b0) {
|
||
|
return a1 >= b0;
|
||
|
}
|
||
|
|
||
|
if (a0 >= b0) {
|
||
|
return b1 >= a0;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Given two ranges,return ther intersection of the two ranges if any e.g. the
|
||
|
* intersection of [1, 3] and [2, 4] is [2, 3].
|
||
|
*
|
||
|
* @param param0 The first range to compare
|
||
|
* @param param1 The second range to compare
|
||
|
* @returns The inclusive range intersection or NULL if no intersection
|
||
|
*/
|
||
|
export const rangeIntersection = (
|
||
|
[a0, a1]: InclusiveRange,
|
||
|
[b0, b1]: InclusiveRange,
|
||
|
): InclusiveRange | null => {
|
||
|
const rangeStart = Math.max(a0, b0);
|
||
|
const rangeEnd = Math.min(a1, b1);
|
||
|
|
||
|
if (rangeStart <= rangeEnd) {
|
||
|
return toBrandedType<InclusiveRange>([rangeStart, rangeEnd]);
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Determine if a value is inside a range.
|
||
|
*
|
||
|
* @param value The value to check
|
||
|
* @param range The range
|
||
|
* @returns
|
||
|
*/
|
||
|
export const rangeIncludesValue = (
|
||
|
value: number,
|
||
|
[min, max]: InclusiveRange,
|
||
|
): boolean => {
|
||
|
return value >= min && value <= max;
|
||
|
};
|