UNPKG

@technobuddha/library

Version:
151 lines 8.27 kB
/** * 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydGVzaWFuLW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jYXJ0ZXNpYW4tbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNOLEtBQUssR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVoRTs7OztPQUlHO0lBQ0gsWUFBbUIsU0FBbUM7UUFDcEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLElBQUk7UUFDYixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsY0FBYyxDQUFDO0lBRXREOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQWdCO1FBQzVCLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLE9B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