@launchmenu/core
Version:
An environment for visual keyboard controlled applets
190 lines • 15 kB
JavaScript
"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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