@tldraw/state
Version:
tldraw infinite canvas SDK (state).
163 lines (162 loc) • 4.08 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var ArraySet_exports = {};
__export(ArraySet_exports, {
ARRAY_SIZE_THRESHOLD: () => ARRAY_SIZE_THRESHOLD,
ArraySet: () => ArraySet
});
module.exports = __toCommonJS(ArraySet_exports);
const ARRAY_SIZE_THRESHOLD = 8;
class ArraySet {
arraySize = 0;
array = Array(ARRAY_SIZE_THRESHOLD);
set = null;
/**
* Get whether this ArraySet has any elements.
*
* @returns True if this ArraySet has any elements, false otherwise.
*/
// eslint-disable-next-line no-restricted-syntax
get isEmpty() {
if (this.array) {
return this.arraySize === 0;
}
if (this.set) {
return this.set.size === 0;
}
throw new Error("no set or array");
}
/**
* Add an item to the ArraySet if it is not already present.
*
* @param elem - The element to add.
*/
add(elem) {
if (this.array) {
const idx = this.array.indexOf(elem);
if (idx !== -1) {
return false;
}
if (this.arraySize < ARRAY_SIZE_THRESHOLD) {
this.array[this.arraySize] = elem;
this.arraySize++;
return true;
} else {
this.set = new Set(this.array);
this.array = null;
this.set.add(elem);
return true;
}
}
if (this.set) {
if (this.set.has(elem)) {
return false;
}
this.set.add(elem);
return true;
}
throw new Error("no set or array");
}
/**
* Remove an item from the ArraySet if it is present.
*
* @param elem - The element to remove
*/
remove(elem) {
if (this.array) {
const idx = this.array.indexOf(elem);
if (idx === -1) {
return false;
}
this.array[idx] = void 0;
this.arraySize--;
if (idx !== this.arraySize) {
this.array[idx] = this.array[this.arraySize];
this.array[this.arraySize] = void 0;
}
return true;
}
if (this.set) {
if (!this.set.has(elem)) {
return false;
}
this.set.delete(elem);
return true;
}
throw new Error("no set or array");
}
/**
* Run a callback for each element in the ArraySet.
*
* @param visitor - The callback to run for each element.
*/
visit(visitor) {
if (this.array) {
for (let i = 0; i < this.arraySize; i++) {
const elem = this.array[i];
if (typeof elem !== "undefined") {
visitor(elem);
}
}
return;
}
if (this.set) {
this.set.forEach(visitor);
return;
}
throw new Error("no set or array");
}
*[Symbol.iterator]() {
if (this.array) {
for (let i = 0; i < this.arraySize; i++) {
const elem = this.array[i];
if (typeof elem !== "undefined") {
yield elem;
}
}
} else if (this.set) {
yield* this.set;
} else {
throw new Error("no set or array");
}
}
has(elem) {
if (this.array) {
return this.array.indexOf(elem) !== -1;
} else {
return this.set.has(elem);
}
}
clear() {
if (this.set) {
this.set.clear();
} else {
this.arraySize = 0;
this.array = [];
}
}
size() {
if (this.set) {
return this.set.size;
} else {
return this.arraySize;
}
}
}
//# sourceMappingURL=ArraySet.js.map