@technobuddha/library
Version:
A large library of useful functions
151 lines • 8.27 kB
JavaScript
/**
* Represents a map with keys of cartesian coordinates, optimized for efficient storage and lookup.
*
* `CartesianMap` provides map-like operations (get, set, has, etc)
* for objects with `{ x, y }` properties, where `x` and `y` are numbers.
*
* Internally, values are stored in a nested `Map<number, Set<number>>` structure,
* allowing for fast addition, deletion, and membership checks.
*
* Supports all standard map operations, as well as iteration and forEach.
*
* @group Geometry
* @category Coordinates
*/
export class CartesianMap {
xaxis = new Map();
/**
* Creates a new `CartesianSet` optionally initialized with an array of cartesian.
*
* @param cartesian - Optional array of cartesian to initialize the set.
*/
constructor(cartesian) {
if (cartesian) {
for (const [key, value] of cartesian) {
this.set(key, value);
}
}
}
/**
* Gets the number of unique cartesian in the set.
*/
get size() {
let size = 0;
for (const map of this.xaxis.values()) {
size += map.size;
}
return size;
}
[Symbol.toStringTag] = 'CartesianMap';
/**
* Removes all cartesian from the set.
*/
clear() {
this.xaxis.clear();
}
/**
* Removes a coordinate from the map.
*
* @param value - The coordinate to remove.
* @returns `true` if the coordinate was present and removed, `false` otherwise.
*/
delete(value) {
const { x, y } = value;
const map = this.xaxis.get(x);
if (map) {
const deleted = map.delete(y);
if (map.size === 0) {
this.xaxis.delete(x);
}
return deleted;
}
return false;
}
/**
* Returns an iterator over `[coordinate, value]` pairs for each coordinate in the map.
*
* @returns An iterator of `[Cartesian, *V*]` pairs.
*/
*entries() {
for (const [x, yaxis] of this.xaxis.entries()) {
for (const [y, value] of yaxis.entries()) {
yield [{ x, y }, value];
}
}
}
/**
* Executes a provided function once for each coordinate in the set.
*
* @param callback - Function to execute for each coordinate.
* @param thisArg - Value to use as `this` when executing `callback`.
*/
forEach(callback, thisArg) {
for (const [key, value] of this.entries()) {
callback.call(thisArg, value, key, this);
}
}
/**
* Retrieves the value associated with the given Cartesian key.
*
* @param key - The Cartesian coordinate used to locate the value.
* @returns The value of type `V` if found; otherwise, `undefined`.
*/
get(key) {
const yaxis = this.xaxis.get(key.x);
return yaxis ? yaxis.get(key.y) : undefined;
}
/**
* Returns an iterator over the cartesian in the set.
*
* @returns An iterator of `Cartesian`.
*/
*keys() {
for (const [x, yaxis] of this.xaxis.entries()) {
for (const y of yaxis.keys()) {
yield { x, y };
}
}
}
/**
* Checks if a coordinate is present in the set.
*
* @param coordinate - The coordinate to check.
* @returns `true` if the coordinate exists in the set, `false` otherwise.
*/
has({ x, y }) {
const yaxis = this.xaxis.get(x);
return yaxis ? yaxis.has(y) : false;
}
/**
* Add or update a value in the map.
*
* @param value - A single coordinate or an array of cartesian to add.
* @returns The set itself, for chaining.
*/
set(key, value) {
if (!this.xaxis.has(key.x)) {
this.xaxis.set(key.x, new Map());
}
this.xaxis.get(key.x).set(key.y, value);
return this;
}
/**
* Returns an iterator over the cartesian in the set.
*
* @returns An iterator of `Cartesian`.
*/
*values() {
for (const yaxis of this.xaxis.values()) {
yield* yaxis.values();
}
}
/**
* Returns an iterator over the cartesian in the set.
*
* @returns An iterator of `Cartesian`.
*/
[Symbol.iterator]() {
return this.entries();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydGVzaWFuLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jYXJ0ZXNpYW4tbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNOLEtBQUssR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsWUFBbUIsU0FBbUM7UUFDcEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLElBQUk7UUFDYixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsY0FBYyxDQUFDO0lBRXREOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQWdCO1FBQzVCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksQ0FBQyxPQUFPO1FBQ2IsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FDWixRQUFrRSxFQUNsRSxPQUFpQjtRQUVqQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDMUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksR0FBRyxDQUFDLEdBQWM7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksQ0FBQyxJQUFJO1FBQ1YsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUM3QixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBYTtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEdBQUcsQ0FBQyxHQUFjLEVBQUUsS0FBUTtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksQ0FBQyxNQUFNO1FBQ1osS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDeEMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0NBQ0YifQ==