@hsaadawy/ngx-chat
Version:
89 lines • 10.5 kB
JavaScript
export const identity = elem => elem;
export const toString = elem => elem.toString();
/**
* given a sorted list, insert the given item in place after the last matching item.
* @param elemToInsert the item to insert
* @param list the list in which the element should be inserted
* @param keyExtractor an optional element mapper, defaults to toString
*/
export function insertSortedLast(elemToInsert, list, keyExtractor = toString) {
list.splice(findSortedInsertionIndexLast(keyExtractor(elemToInsert), list, keyExtractor), 0, elemToInsert);
}
/**
* Find the highest possible index where the given element should be inserted so that the order of the list is preserved.
* @param needle the needle to find
* @param haystack the pre sorted list
* @param keyExtractor an optional needle mapper, defaults to toString
*/
export function findSortedInsertionIndexLast(needle, haystack, keyExtractor = toString) {
let low = 0;
let high = haystack.length;
while (low !== high) {
const cur = Math.floor(low + (high - low) / 2);
if (needle < keyExtractor(haystack[cur])) {
high = cur;
}
else {
low = cur + 1;
}
}
return low;
}
/**
* Find the index of an element in a sorted list. If list contains no matching element, return -1.
*/
export function findSortedIndex(needle, haystack, keyExtractor = toString) {
let low = 0;
let high = haystack.length;
while (low !== high) {
const cur = Math.floor(low + (high - low) / 2);
const extractedKey = keyExtractor(haystack[cur]);
if (needle < extractedKey) {
high = cur;
}
else if (needle > extractedKey) {
low = cur + 1;
}
else {
return cur;
}
}
return -1;
}
/**
* Like {@link Array.prototype.findIndex} but finds the last index instead.
*/
export function findLastIndex(arr, predicate) {
for (let i = arr.length - 1; i >= 0; i--) {
if (predicate(arr[i])) {
return i;
}
}
return -1;
}
/**
* Like {@link Array.prototype.find} but finds the last matching element instead.
*/
export function findLast(arr, predicate) {
return arr[findLastIndex(arr, predicate)];
}
/**
* Return a new array, where all elements from the original array occur exactly once.
*/
export function removeDuplicates(arr, eq = (x, y) => x === y) {
const results = [];
for (const arrElement of arr) {
let duplicateFound = false;
for (const resultElement of results) {
if (eq(arrElement, resultElement)) {
duplicateFound = true;
break;
}
}
if (!duplicateFound) {
results.push(arrElement);
}
}
return results;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXp6bmV0d29yay9uZ3gtY2hhdC9zcmMvbGliL2NvcmUvdXRpbHMtYXJyYXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFzQixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQTBCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBRXZFOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFJLFlBQWUsRUFBRSxJQUFTLEVBQUUsZUFBOEIsUUFBUTtJQUNsRyxJQUFJLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQy9HLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FBTyxNQUFTLEVBQUUsUUFBYSxFQUFFLGVBQThCLFFBQVE7SUFDL0csSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUUzQixPQUFPLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFFakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFL0MsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3RDLElBQUksR0FBRyxHQUFHLENBQUM7U0FDZDthQUFNO1lBQ0gsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDakI7S0FFSjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBTyxNQUFTLEVBQUUsUUFBYSxFQUFFLGVBQThCLFFBQVE7SUFDbEcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUUzQixPQUFPLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFFakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFL0MsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxHQUFHLFlBQVksRUFBRTtZQUN2QixJQUFJLEdBQUcsR0FBRyxDQUFDO1NBQ2Q7YUFBTSxJQUFJLE1BQU0sR0FBRyxZQUFZLEVBQUU7WUFDOUIsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDakI7YUFBTTtZQUNILE9BQU8sR0FBRyxDQUFDO1NBQ2Q7S0FFSjtJQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFJLEdBQVEsRUFBRSxTQUE0QjtJQUNuRSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkIsT0FBTyxDQUFDLENBQUM7U0FDWjtLQUNKO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNkLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUksR0FBUSxFQUFFLFNBQTRCO0lBQzlELE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksR0FBUSxFQUFFLEtBQThCLENBQUMsQ0FBSSxFQUFFLENBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDL0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssTUFBTSxVQUFVLElBQUksR0FBRyxFQUFFO1FBQzFCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixLQUFLLE1BQU0sYUFBYSxJQUFJLE9BQU8sRUFBRTtZQUNqQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEVBQUU7Z0JBQy9CLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU07YUFDVDtTQUNKO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVCO0tBQ0o7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGlkZW50aXR5OiA8VD4oZWxlbTogVCkgPT4gVCA9IGVsZW0gPT4gZWxlbTtcclxuZXhwb3J0IGNvbnN0IHRvU3RyaW5nOiAoZWxlbTogYW55KSA9PiBzdHJpbmcgPSBlbGVtID0+IGVsZW0udG9TdHJpbmcoKTtcclxuXHJcbi8qKlxyXG4gKiBnaXZlbiBhIHNvcnRlZCBsaXN0LCBpbnNlcnQgdGhlIGdpdmVuIGl0ZW0gaW4gcGxhY2UgYWZ0ZXIgdGhlIGxhc3QgbWF0Y2hpbmcgaXRlbS5cclxuICogQHBhcmFtIGVsZW1Ub0luc2VydCB0aGUgaXRlbSB0byBpbnNlcnRcclxuICogQHBhcmFtIGxpc3QgdGhlIGxpc3QgaW4gd2hpY2ggdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkXHJcbiAqIEBwYXJhbSBrZXlFeHRyYWN0b3IgYW4gb3B0aW9uYWwgZWxlbWVudCBtYXBwZXIsIGRlZmF1bHRzIHRvIHRvU3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U29ydGVkTGFzdDxVPihlbGVtVG9JbnNlcnQ6IFUsIGxpc3Q6IFVbXSwga2V5RXh0cmFjdG9yOiAoYTogVSkgPT4gYW55ID0gdG9TdHJpbmcpOiB2b2lkIHtcclxuICAgIGxpc3Quc3BsaWNlKGZpbmRTb3J0ZWRJbnNlcnRpb25JbmRleExhc3Qoa2V5RXh0cmFjdG9yKGVsZW1Ub0luc2VydCksIGxpc3QsIGtleUV4dHJhY3RvciksIDAsIGVsZW1Ub0luc2VydCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGluZGV4IHdoZXJlIHRoZSBnaXZlbiBlbGVtZW50IHNob3VsZCBiZSBpbnNlcnRlZCBzbyB0aGF0IHRoZSBvcmRlciBvZiB0aGUgbGlzdCBpcyBwcmVzZXJ2ZWQuXHJcbiAqIEBwYXJhbSBuZWVkbGUgdGhlIG5lZWRsZSB0byBmaW5kXHJcbiAqIEBwYXJhbSBoYXlzdGFjayB0aGUgcHJlIHNvcnRlZCBsaXN0XHJcbiAqIEBwYXJhbSBrZXlFeHRyYWN0b3IgYW4gb3B0aW9uYWwgbmVlZGxlIG1hcHBlciwgZGVmYXVsdHMgdG8gdG9TdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kU29ydGVkSW5zZXJ0aW9uSW5kZXhMYXN0PFUsIFY+KG5lZWRsZTogVSwgaGF5c3RhY2s6IFZbXSwga2V5RXh0cmFjdG9yOiAoYTogVikgPT4gYW55ID0gdG9TdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGxvdyA9IDA7XHJcbiAgICBsZXQgaGlnaCA9IGhheXN0YWNrLmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAobG93ICE9PSBoaWdoKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1ciA9IE1hdGguZmxvb3IobG93ICsgKGhpZ2ggLSBsb3cpIC8gMik7XHJcblxyXG4gICAgICAgIGlmIChuZWVkbGUgPCBrZXlFeHRyYWN0b3IoaGF5c3RhY2tbY3VyXSkpIHtcclxuICAgICAgICAgICAgaGlnaCA9IGN1cjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb3cgPSBjdXIgKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxvdztcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmQgdGhlIGluZGV4IG9mIGFuIGVsZW1lbnQgaW4gYSBzb3J0ZWQgbGlzdC4gSWYgbGlzdCBjb250YWlucyBubyBtYXRjaGluZyBlbGVtZW50LCByZXR1cm4gLTEuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZFNvcnRlZEluZGV4PFUsIFY+KG5lZWRsZTogVSwgaGF5c3RhY2s6IFZbXSwga2V5RXh0cmFjdG9yOiAoYTogVikgPT4gYW55ID0gdG9TdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IGxvdyA9IDA7XHJcbiAgICBsZXQgaGlnaCA9IGhheXN0YWNrLmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAobG93ICE9PSBoaWdoKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1ciA9IE1hdGguZmxvb3IobG93ICsgKGhpZ2ggLSBsb3cpIC8gMik7XHJcblxyXG4gICAgICAgIGNvbnN0IGV4dHJhY3RlZEtleSA9IGtleUV4dHJhY3RvcihoYXlzdGFja1tjdXJdKTtcclxuICAgICAgICBpZiAobmVlZGxlIDwgZXh0cmFjdGVkS2V5KSB7XHJcbiAgICAgICAgICAgIGhpZ2ggPSBjdXI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZWVkbGUgPiBleHRyYWN0ZWRLZXkpIHtcclxuICAgICAgICAgICAgbG93ID0gY3VyICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG59XHJcblxyXG4vKipcclxuICogTGlrZSB7QGxpbmsgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleH0gYnV0IGZpbmRzIHRoZSBsYXN0IGluZGV4IGluc3RlYWQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihhcnI6IFRbXSwgcHJlZGljYXRlOiAoeDogVCkgPT4gYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJbaV0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAtMTtcclxufVxyXG5cclxuLyoqXHJcbiAqIExpa2Uge0BsaW5rIEFycmF5LnByb3RvdHlwZS5maW5kfSBidXQgZmluZHMgdGhlIGxhc3QgbWF0Y2hpbmcgZWxlbWVudCBpbnN0ZWFkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGFycjogVFtdLCBwcmVkaWNhdGU6ICh4OiBUKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYXJyW2ZpbmRMYXN0SW5kZXgoYXJyLCBwcmVkaWNhdGUpXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhIG5ldyBhcnJheSwgd2hlcmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGFycmF5IG9jY3VyIGV4YWN0bHkgb25jZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVzPFQ+KGFycjogVFtdLCBlcTogKHg6IFQsIHk6IFQpID0+IGJvb2xlYW4gPSAoeDogVCwgeTogVCkgPT4geCA9PT0geSk6IFRbXSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGFyckVsZW1lbnQgb2YgYXJyKSB7XHJcbiAgICAgICAgbGV0IGR1cGxpY2F0ZUZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHRFbGVtZW50IG9mIHJlc3VsdHMpIHtcclxuICAgICAgICAgICAgaWYgKGVxKGFyckVsZW1lbnQsIHJlc3VsdEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGVGb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWR1cGxpY2F0ZUZvdW5kKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChhcnJFbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxufVxyXG4iXX0=