@thi.ng/intervals
Version:
Closed/open/semi-open interval data type, queries & operations
314 lines • 8.77 kB
TypeScript
import type { Fn, ICompare, IContains, ICopy, IEquiv } from "@thi.ng/api";
export declare enum Classifier {
DISJOINT_LEFT = 0,
DISJOINT_RIGHT = 1,
EQUIV = 2,
SUBSET = 3,
SUPERSET = 4,
OVERLAP_LEFT = 5,
OVERLAP_RIGHT = 6
}
export declare class Interval implements ICompare<Interval>, IContains<number>, ICopy<Interval>, IEquiv {
l: number;
r: number;
lopen: boolean;
ropen: boolean;
constructor(l: number, r: number, lopen?: boolean, ropen?: boolean);
get size(): number;
copy(): Interval;
/**
* Compares this interval with `i` and returns a comparator value
* (-1, 0 or 1). Comparison order is: LHS, RHS, openness.
*
* @param i -
*/
compare(i: Readonly<Interval>): number;
equiv(i: any): boolean;
/**
* Returns true if `x` is lies within this interval.
*
* @param x -
*/
contains(x: number): boolean;
toString(): string;
toJSON(): string;
}
export declare function interval(spec: string): Interval;
export declare function interval(l: number, r: number, lopen?: boolean, ropen?: boolean): Interval;
/**
* Parses given ISO 80000-2 interval notation into a new `Interval`
* instance. In addition to the comma separator, `..` can be used
* alternatively. The following symbols (with optional sign) can be
* used for infinity (case insensitive):
*
* - inf
* - infinity
* - ∞ (\u221e)
*
* An empty LHS defaults to `-Infinity`. The RHS defaults to
* `+Infinity`.
*
* Openness / closedness symbols:
*
* - LHS: open: `]` / `(`, closed: `[`
* - RHS: open: `[` / `)`, closed: `]`
*
* ```js
* import { parse } from "@thi.ng/interval";
*
* // semi-open interval between -∞ and +1
* parse("[,1)")
*
* // closed interval between -1 and +1
* parse("[-1 .. 1]")
* ```
*
* @param src -
*/
export declare const parse: (src: string) => Interval;
/**
* Returns new infinite interval `[-∞,∞]`
*/
export declare const infinity: () => Interval;
/**
* Returns new interval of `[min,∞]` or `(min,∞]` depending on if `open` is true
* (default: false).
*
* @param min -
* @param open -
*/
export declare const withMin: (min: number, open?: boolean) => Interval;
/**
* Returns new interval of `[∞,max]` or `[∞,max)` depending on if `open` is true
* (default: false).
*
* @param max -
* @param open -
*/
export declare const withMax: (max: number, open?: boolean) => Interval;
/**
* Returns an open interval `(min,max)`
*
* @param min -
* @param max -
*/
export declare const open: (min: number, max: number) => Interval;
/**
* Returns a semi-open interval `(min,max]`, open on the LHS.
*
* @param min -
* @param max -
*/
export declare const openClosed: (min: number, max: number) => Interval;
/**
* Returns a semi-open interval `[min,max)`, open on the RHS.
*
* @param min -
* @param max -
*/
export declare const closedOpen: (min: number, max: number) => Interval;
/**
* Returns a closed interval `(min,max)`.
*
* @param min -
* @param max -
*/
export declare const closed: (min: number, max: number) => Interval;
/**
* Returns iterator of values in given interval at given `step` size. If the
* interval is open on either side, the first and/or last sample will be
* omitted.
*
* @param i -
* @param step -
*/
export declare const values: (i: Readonly<Interval>, step: number) => Generator<number, void, unknown>;
/**
* Returns an iterator yielding up to `n` uniformly spaced samples in given
* interval. If the interval is open on either side, the first and/or last
* sample will be omitted.
*
* @example
* ```js
* import { samples, closed } from "@thi.ng/intervals";
*
* [...samples(closed(10, 12), 5)]
* // [10, 10.5, 11, 11.5, 12]
*
* [...samples(open(10, 12), 5)]
* // [10.5, 11, 11.5]
* ```
*
* @param i -
* @param n -
*/
export declare function samples(i: Readonly<Interval>, n: number): Generator<number, void, unknown>;
/**
* Returns true, if interval has zero range, i.e. if LHS >= RHS.
*
* @param i -
*/
export declare const isEmpty: (i: Readonly<Interval>) => boolean;
/**
* Returns true iff interval `i` RHS < `x`, taking into account openness. If `x`
* is an interval, then checks `i` RHS is less than LHS of `x` (again with
* openness).
*
* @param i -
* @param x -
*/
export declare const isBefore: (i: Readonly<Interval>, x: number | Readonly<Interval>) => boolean;
/**
* Returns true iff interval `i` LHS > `x`, taking into account openness. If `x`
* is an interval, then checks `i` LHS is greater than RHS of `x` (again with
* openness).
*
* @param i -
* @param x -
*/
export declare const isAfter: (i: Readonly<Interval>, x: number | Readonly<Interval>) => boolean;
/**
* Compares interval `a` with `b` and returns a comparator value (-1, 0 or 1).
* Comparison order is: LHS, RHS, openness.
*
* @param a -
* @param b -
*/
export declare const compare: (a: Readonly<Interval>, b: Readonly<Interval>) => number;
/**
* Returns true if `x` is lies within interval `i`.
*
* @param i -
* @param x -
*/
export declare const contains: (i: Readonly<Interval>, x: number) => boolean;
export declare const centroid: (i: Readonly<Interval>) => number;
/**
* Returns a new version of interval `i` such that `x` is included. If `x` lies
* outside the current interval, the new one will be extended correspondingly.
*
* @param i -
* @param x -
*/
export declare const include: (i: Readonly<Interval>, x: number) => Interval;
/**
* Returns the distance between intervals, or zero if they touch or overlap.
*
* @param a -
* @param b -
*/
export declare const distance: (a: Readonly<Interval>, b: Readonly<Interval>) => number;
/**
* Applies given `fn` to both sides of interval `i` and returns a new
* {@link Interval} of transformed end points.
*
* @param i -
* @param fn -
*/
export declare const transform: (i: Readonly<Interval>, fn: Fn<number, number>) => Interval;
/**
* Returns classifier for interval `a` WRT given interval `b`. E.g. if the
* result is `Classifier.SUPERSET`, then interval `a` fully contains `b`.
*
* ```text
* EQUIV
* [ a ]
* [ b ]
*
* DISJOINT_LEFT
* [ b ]
* [ a ]
*
* DISJOINT_RIGHT
* [ a ]
* [ b ]
*
* SUPERSET
* [ a ]
* [ b ]
*
* SUBSET
* [ b ]
* [ a ]
*
* OVERLAP_RIGHT
* [ a ]
* [ b ]
*
* OVERLAP_LEFT
* [ b ]
* [ a ]
* ```
*
* @param a -
* @param b -
*/
export declare const classify: (a: Readonly<Interval>, b: Readonly<Interval>) => Classifier;
/**
* Returns true if interval `a` intersects `b` in any way (incl. subset /
* superset).
*
* @param a -
* @param b -
*/
export declare const overlaps: (a: Readonly<Interval>, b: Readonly<Interval>) => boolean;
/**
* Returns the union of the two given intervals, taken their openness into
* account.
*
* @param a -
* @param b -
*/
export declare const union: (a: Readonly<Interval>, b: Readonly<Interval>) => Readonly<Interval>;
/**
* Returns the intersection of the two given intervals, taken their openness
* into account. Returns undefined if `a` and `b` don't overlap.
*
* @param a -
* @param b -
*/
export declare const intersection: (a: Readonly<Interval>, b: Readonly<Interval>) => Interval | undefined;
export declare const prefix: (a: Readonly<Interval>, b: Readonly<Interval>) => Interval | undefined;
export declare const suffix: (a: Readonly<Interval>, b: Readonly<Interval>) => Interval | undefined;
/**
* Returns the lesser value of either `x` or interval `i`'s RHS value. If the
* interval is open on the RHS, and `x >= r`, then `r - eps` will be returned.
*
* @param i -
* @param x -
* @param eps -
*/
export declare const min: (i: Readonly<Interval>, x: number, eps?: number) => number;
/**
* Returns the greater value of either `x` or interval `i`'s LHS value. If the
* interval is open on the LHS, and `x <= l`, then `l + eps` will be returned.
*
* @param i -
* @param x -
* @param eps -
*/
export declare const max: (i: Readonly<Interval>, x: number, eps?: number) => number;
/**
* Clamps `x` to interval `i`, using {@link min} and {@link max}.
*
* @param i -
* @param x -
* @param eps -
*/
export declare const clamp: (i: Readonly<Interval>, x: number, eps?: number) => number;
/**
* Folds `x` back into interval `i`, should it lie outside. `x` MUST originally
* lie in the `(i.l-i.size .. i.r+i.size)` interval.
*
* @remarks
* Current implementation is recursive and O(N) where N = ceil(max(|x-i.l|,
* \x-i.r|) / i.size).
*
* See {@link min} or {@link max} for handling of optional `eps` arg.
*
* @param i
* @param x
* @param eps
*/
export declare const fold: (i: Readonly<Interval>, x: number, eps?: number) => number;
//# sourceMappingURL=index.d.ts.map