indexed
Version:
database-like indexed array that always returns a new array
461 lines (412 loc) • 13.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.concat = concat;
exports.clear = clear;
exports.filter = filter;
exports.forEach = forEach;
exports.transform = transform;
exports.pop = pop;
exports.push = push;
exports.reverse = reverse;
exports.shift = shift;
exports.slice = slice;
exports.sort = sort;
exports.splice = splice;
exports.unshift = unshift;
exports.setItemByIndex = setItemByIndex;
exports.setItemWhere = setItemWhere;
exports.setMultipleItemsByIndex = setMultipleItemsByIndex;
exports.setMany = setMany;
exports.removeMany = removeMany;
exports.set = set;
exports.replace = replace;
exports.remove = remove;
exports.findMany = findMany;
exports.fromJson = fromJson;
var _arrayIndexes = require('./array-indexes');
var _utils = require('./utils');
var _constants = require('./constants');
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
function concat(props, arr) {
var indexes = props.indexes;
var mutate = props.mutate;
for (var _len = arguments.length, values = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
values[_key - 2] = arguments[_key];
}
var length = values.length;var i = 0;var index = arr.length;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
props.lastIndexes = [];
if (!length) {
return [newIndexes, newArr];
}
while (i < length) {
var value = values[i++];
if ((0, _utils.isArrayLike)(value)) {
var valueLength = value.length,
j = 0;
while (j < valueLength) {
var subValue = value[j++];
(0, _arrayIndexes.setIndexes)(newIndexes, subValue, index);
props.lastIndexes.push(index);
newArr[index++] = subValue;
}
} else {
(0, _arrayIndexes.setIndexes)(newIndexes, value, index);
props.lastIndexes.push(index);
newArr[index++] = value;
}
}
return [newIndexes, newArr];
}
function clear(props, arr) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr;
var newIndexes = indexes ? (0, _arrayIndexes.copyIndexes)(indexes) : null;
if (mutate) {
newArr = _constants.arrProto.splice.call(0, arr.length);
} else {
newArr = [];
}
return [newIndexes, newArr];
}
function filter(props, arr, callback, thisArg) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = _constants.arrProto.filter.call(arr, callback, thisArg);
var newIndexes = indexes ? (0, _arrayIndexes.copyIndexes)(indexes) : null;
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function forEach(props, arr, callback, thisArg) {
var indexes = props.indexes;
var mutate = props.mutate;
var length = arr.length;var i = 0;
while (i < length) {
var val = arr[i];
var result = callback.call(thisArg, val, i, arr);
if (result === _constants.BREAK) {
return;
}
i++;
}
return [indexes, arr];
}
function transform(props, arr, callback, thisArg) {
var indexes = props.indexes;
var mutate = props.mutate;
props.lastIndexes = [];
var length = arr.length;var i = 0;var newArr = mutate ? arr : new Array(length);
while (i < length) {
var val = arr[i];
var result = callback.call(thisArg, val, i, arr);
if (result === _constants.BREAK) {
break;
}
if (result === _constants.SKIP) {
result = false;
}
props.lastIndexes.push(i);
newArr[i] = result;
i++;
}
newArr = _constants.arrProto.filter.call(newArr, Boolean);
var newIndexes = indexes ? (0, _arrayIndexes.copyIndexes)(indexes) : null;
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function pop(props, arr, receiver) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var popped = newArr.pop();
if (receiver) {
receiver[0] = popped;
}
(0, _arrayIndexes.removeIndexes)(newIndexes, popped);
return [newIndexes, newArr];
}
function push(props, arr) {
var indexes = props.indexes;
var mutate = props.mutate;
props.lastIndexes = [];
for (var _len2 = arguments.length, values = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
values[_key2 - 2] = arguments[_key2];
}
var length = values.length;var i = 0;var index = arr.length;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
if (!length) {
return [newIndexes, newArr];
}
var max = i + length;
while (i < length) {
var value = values[i++];
(0, _arrayIndexes.setIndexes)(newIndexes, value, index);
props.lastIndexes.push(index);
newArr[index++] = value;
}
return [newIndexes, newArr];
}
function reverse(props, arr) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
newArr.reverse();
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function shift(props, arr, receiver) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var shifted = newArr.shift();
if (receiver) {
receiver[0] = shifted;
}
if (newIndexes) {
(0, _arrayIndexes.removeIndexes)(newIndexes, shifted);
(0, _arrayIndexes.shiftIndexes)(newIndexes, -1);
}
return [newIndexes, newArr];
}
function slice(props, arr, begin, end) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = (0, _utils.slice)(arr, begin, end);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var length = newArr.length;var i = 0;
if (length != arr.length) {
newIndexes = (0, _arrayIndexes.reindex)(newIndexes, newArr);
}
return [newIndexes, newArr];
}
function sort(props, arr, compareFunction) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.copyIndexes)(indexes) : null;
if (!compareFunction || typeof compareFunction == 'function') {
newArr.sort(compareFunction);
} else {
var prop = compareFunction;
newArr.sort(function (a, b) {
return prop in a && prop in b ? a[prop] > b[prop] ? 1 : a[prop] < b[prop] ? -1 : 0 : 0;
});
}
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function fillArrayFrom(length, start) {
return Array.apply(null, Array(length)).map(function (el, i) {
return start + i;
});
}
function splice(props, arr, start, deleteCount) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr;
deleteCount = deleteCount || 0;
props.lastIndexes = [];
for (var _len3 = arguments.length, items = Array(_len3 > 4 ? _len3 - 4 : 0), _key3 = 4; _key3 < _len3; _key3++) {
items[_key3 - 4] = arguments[_key3];
}
if (mutate) {
var _arrProto$splice;
newArr = arr;
(_arrProto$splice = _constants.arrProto.splice).call.apply(_arrProto$splice, [newArr, start, deleteCount].concat(items));
} else {
var head = (0, _utils.slice)(arr, 0, start);
var tail = (0, _utils.slice)(arr, start + deleteCount);
newArr = [].concat(head, items, tail);
}
if (items.length) {
props.lastIndexes = fillArrayFrom(items.length, start);
}
var newIndexes = indexes ? (0, _arrayIndexes.copyIndexes)(indexes) : null;
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function unshift(props, arr) {
var indexes = props.indexes;
var mutate = props.mutate;
for (var _len4 = arguments.length, values = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {
values[_key4 - 2] = arguments[_key4];
}
var length = values.length;var i = 0;
props.lastIndexes = [];
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var newArr;
if (!length) {
return [newIndexes, newArr];
}
if (newIndexes) {
(0, _arrayIndexes.shiftIndexes)(newIndexes, length);
while (i < length) {
var value = values[i];
(0, _arrayIndexes.setIndexes)(newIndexes, value, i++);
}
}
if (mutate) {
_constants.arrProto.unshift.apply(arr, values);
newArr = arr;
} else {
newArr = [].concat(values, arr);
}
props.lastIndexes = fillArrayFrom(values.length, 0);
return [newIndexes, newArr];
}
function setItemByIndex(props, arr, index, value, replace, remove) {
var indexes = props.indexes;
var mutate = props.mutate;
if (typeof index == 'undefined' || index === null) {
index = arr.length;
}
if (index < 0) {
index = arr.length + index;
}
if (index >= arr.length) {
return push(props, arr, value);
}
var newArr;
var oldObj = arr[index];
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
if (remove) {
if (mutate) {
_constants.arrProto.splice.call(arr, index, 1);
newArr = arr;
} else {
newArr = (0, _utils.slice)(arr, 0, index).concat((0, _utils.slice)(arr, index + 1));
}
(0, _arrayIndexes.reindex)(newIndexes, newArr);
} else {
newArr = mutate ? arr : (0, _utils.slice)(arr);
if (replace) {
newArr[index] = value;
(0, _arrayIndexes.removeIndexes)(newIndexes, oldObj);
(0, _arrayIndexes.setIndexes)(newIndexes, value, index);
} else {
(0, _arrayIndexes.changeIndexes)(newIndexes, oldObj, value, index);
newArr[index] = (0, _utils.assign)(oldObj, value);
}
props.lastIndexes = [index];
}
return [newIndexes, newArr];
}
function setItemWhere(props, arr, predicate, value, replace, remove) {
var indexes = props.indexes;
var mutate = props.mutate;
var index = (0, _arrayIndexes.findIndex)(props, arr, predicate);
props.lastIndexes = [];
if (index < 0) {
return [indexes, arr];
}
return setItemByIndex(props, arr, index, value, replace, remove);
}
function setMultipleItemsByIndex(props, arr, indexesList, value, remove) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var length = indexesList.length;
var i = 0;
props.lastIndexes = [];
if (!length) {
return [newIndexes, newArr];
}
var newProps = { indexes: newIndexes, mutate: true, lastIndexes: props.lastIndexes };
while (i < length) {
var index = indexesList[i++];
setItemByIndex(newProps, newArr, index, value, false, remove);
}
props.lastIndexes = newProps.lastIndexes;
return [newIndexes, newArr];
}
function setMany(props, arr, predicates, value) {
var indexesList = (0, _arrayIndexes.findIndexes)(props, arr, predicates);
return setMultipleItemsByIndex(props, arr, indexesList, value);
}
function removeMany(props, arr, predicates, value) {
var indexes = props.indexes;
var mutate = props.mutate;
var indexesList = (0, _arrayIndexes.findIndexes)(props, arr, predicates);
var newArr = mutate ? arr : (0, _utils.slice)(arr);
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.cloneIndexes)(indexes) : null;
var length = indexesList.length;
var i = 0;
var n = 0;
if (!length) {
return [newIndexes, newArr];
}
while (i < length) {
var index = indexesList[i++] + n;
if (mutate) {
_constants.arrProto.splice.call(newArr, index, 1);
} else {
newArr = (0, _utils.slice)(newArr, 0, index).concat((0, _utils.slice)(newArr, index + 1));
}
n--;
}
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function set(props, arr, indexOrPredicate, value, replace, remove) {
var indexes = props.indexes;
var mutate = props.mutate;
props.lastIndexes = [];
if (indexOrPredicate !== null && typeof indexOrPredicate !== 'undefined') {
if (typeof indexOrPredicate == 'number') {
return setItemByIndex(props, arr, indexOrPredicate, value, replace, remove);
}
if (indexes) {
return setItemWhere(props, arr, indexOrPredicate, value, replace, remove);
}
}
if (replace || remove) {
throw new Error('replace or remove invoked without a valid index');
}
return push(props, arr, value);
}
function replace(props, arr, indexOrPredicate, value) {
return set(props, arr, indexOrPredicate, value, true, false);
}
function remove(props, arr, indexOrPredicate) {
return set(props, arr, indexOrPredicate, null, false, true);
}
function findMany(props, arr, predicates, thisArg) {
var indexes = props.indexes;
var mutate = props.mutate;
var newArr = [];
var newIndexes = indexes ? mutate ? indexes : (0, _arrayIndexes.copyIndexes)(indexes) : null;
var indexesList = (0, _arrayIndexes.findIndexes)(props, arr, predicates, thisArg);
if (!indexesList.length) {
return [newIndexes, newArr];
}
newArr = indexesList.map(function (index) {
return arr[index];
});
(0, _arrayIndexes.reindex)(newIndexes, newArr);
return [newIndexes, newArr];
}
function fromJson(props, arr, json) {
var indexes = props.indexes;
var mutate = props.mutate;
if (!json) {
return [indexes, arr];
}
var jsonIndexes = json.indexes;
var items = json.items;
var newIndexes = (0, _arrayIndexes.indexesFromJson)(jsonIndexes);
if (mutate) {
arr.length = 0;
arr.push.apply(arr, _toConsumableArray(items));
return [newIndexes, arr];
}
return [newIndexes, items];
}