UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

190 lines 15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SortedList = void 0; const model_react_1 = require("model-react"); const quickSort_1 = require("./quickSort"); /** * A list that sorts items as they are inserted */ class SortedList { /** * Creates a new sorted list that sorts according to given condition * @param condition The sorting condition * @param items The initial items to add */ constructor(data) { this.list = new model_react_1.Field([]); this.condition = data.condition; this.onAdd = data.onAdd; this.onRemove = data.onRemove; if (data.items) this.add(data.items); } // Getters /** * Retrieves the items of the list * @param hook The hook to subscribe to changes * @returns The list of items */ get(hook) { return this.list.get(hook); } find(checkItem) { const l = this.list.get(); let start = 0; let end = l.length - 1; if (checkItem instanceof Function) { while (start < end) { const middle = Math.floor((start + end) / 2); const s = checkItem(l[middle]); if (s == 0) return { index: middle, item: l[middle] }; else if (s == 1) start = middle + 1; else end = middle; } return { index: -1 }; } else { while (start < end) { const middle = Math.floor((start + end) / 2); if (this.condition(l[middle], checkItem)) start = middle + 1; else end = middle; } return l[start] == checkItem ? start : -1; } } add(items, maxItems) { const curItems = this.list.get(); const lastItem = curItems[curItems.length - 1]; let out; if (!(items instanceof Array)) items = [items]; // Ignore any items that aren't in the range if (maxItems && lastItem && curItems.length === maxItems) { items = items.filter(item => !this.condition(lastItem, item)); if (items.length == 0) return; } // Perform a simple sort on the batch of items, and perform a merge of the lists if (items.length > 1) quickSort_1.quickSort(items, this.condition); let n = 0; let m = 0; const maxOutLength = curItems.length + items.length; out = new Array(maxItems ? Math.min(maxItems, maxOutLength) : maxOutLength); for (let i = 0; i < out.length; i++) { if (n != items.length && (m == curItems.length || !this.condition(curItems[m], items[n]))) { out[i] = items[n++]; } else { out[i] = curItems[m++]; } } // Update the item list this.list.set(out); // Call add and remove listeners on items if (this.onRemove) for (; m < curItems.length; m++) this.onRemove(curItems[m]); if (this.onAdd) for (let i = 0; i < n; i++) this.onAdd(items[i]); } remove(items, equals = (a, b) => a == b) { const curItems = this.list.get(); const lastItem = curItems[curItems.length - 1]; let out = new Array(); if (!(items instanceof Array)) items = [items]; // Ignore any items that aren't in the range if (!lastItem) return; items = items.filter(item => !this.condition(lastItem, item)); if (items.length == 0) return; // Sort the array, and perform a kind of 'merge filter' if (items.length > 1) quickSort_1.quickSort(items, this.condition); // FIlter the items let removed = []; let n = 0; let m = 0; for (var i = 0; i < curItems.length; i++) if (items[m] == undefined || !equals(items[m], curItems[i])) out[n++] = curItems[i]; else { removed.push(curItems[i]); m++; } // Update the list out.length = n; this.list.set(out); // Call the listeners if (this.onRemove) removed.forEach(item => { var _a; return (_a = this.onRemove) === null || _a === void 0 ? void 0 : _a.call(this, item); }); return out.length < curItems.length; } removeIndex(indices) { const curItems = this.list.get(); let out = new Array(curItems.length); if (!(indices instanceof Array)) indices = [indices]; // Sort the array, and perform a kind of 'merge filter' if (indices.length > 1) quickSort_1.quickSort(indices); // Filter the items let removed = []; let n = 0; let m = 0; for (var i = 0; i < out.length; i++) if (indices[m] != i) out[n++] = curItems[i]; else { removed.push(curItems[i]); m++; } // Update the list out.length = n; this.list.set(out); // Call the listeners if (this.onRemove) removed.forEach(item => { var _a; return (_a = this.onRemove) === null || _a === void 0 ? void 0 : _a.call(this, item); }); } /** * Removes all items that don't pass the filter * @param include The callback to determine whether to include a given item * @returns Whether any items were returned */ filter(include) { const curItems = this.list.get(); // Filter the items let removed = []; const out = curItems.filter(item => { const keep = include(item); if (!keep) removed.push(item); return keep; }); // Update the list if (out.length >= curItems.length) return false; this.list.set(out); // Call the listeners if (this.onRemove) removed.forEach(item => { var _a; return (_a = this.onRemove) === null || _a === void 0 ? void 0 : _a.call(this, item); }); return true; } /** * Removes all items from the list */ clear() { this.list.set([]); } } exports.SortedList = SortedList; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29ydGVkTGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9Tb3J0ZWRMaXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE2QztBQUM3QywyQ0FBc0M7QUFFdEM7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFNbkI7Ozs7T0FJRztJQUNILFlBQW1CLElBS2xCO1FBZlMsU0FBSSxHQUFHLElBQUksbUJBQUssQ0FBQyxFQUFTLENBQUMsQ0FBQztRQWdCbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxVQUFVO0lBQ1Y7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBQyxJQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFpQk0sSUFBSSxDQUNQLFNBQXdDO1FBRXhDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxTQUFTLFlBQVksUUFBUSxFQUFFO1lBQy9CLE9BQU8sS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDaEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFD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