order-map
Version:
A order-map collection in the form of key, value, that ensures the index.
226 lines (217 loc) • 6.52 kB
JavaScript
/*
Copyright (c) 2019 Daybrush
name: order-map
license: MIT
author: Daybrush
repository: git+https://github.com/daybrush/order-map.git
version: 0.3.1
*/
'use strict';
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
}
/**
*
*/
var OrderMap = /*#__PURE__*/ (function () {
/**
*
*/
function OrderMap(separator) {
this.separator = separator;
this.orderMap = {};
}
/**
*
*/
OrderMap.prototype.getFullName = function (names) {
return names.join(this.separator);
};
/**
*
*/
OrderMap.prototype.get = function (names) {
return this.orderMap[this.getFullName(names)];
};
/**
*
*/
OrderMap.prototype.hasName = function (names) {
var length = names.length;
if (!length) {
return false;
}
var lastName = names[length - 1];
var arr = this.get(names.slice(0, length - 1));
if (arr) {
return arr.indexOf(lastName) >= 0;
}
return false;
};
/**
*
*/
OrderMap.prototype.gets = function (names, isFull) {
if (isFull === void 0) { isFull = true; }
var fullOrders = [];
var self = this;
function pushOrders(nextNames, stack) {
var orders = self.get(nextNames);
if (!orders) {
return;
}
orders.forEach(function (name) {
var nextStack = __spreadArray(__spreadArray([], stack, true), [name], false);
var nextOrders = pushOrders(__spreadArray(__spreadArray([], nextNames, true), [name], false), nextStack);
if (!nextOrders || !nextOrders.length) {
fullOrders.push(__spreadArray(__spreadArray([], stack, true), [name], false));
}
});
return orders;
}
pushOrders(names, isFull ? names : []);
return fullOrders;
};
/**
*
*/
OrderMap.prototype.set = function (names, orders) {
var _this = this;
names.forEach(function (name, i) {
_this.addName(names.slice(0, i), name);
});
this.orderMap[this.getFullName(names)] = orders;
return orders;
};
/**
*
*/
OrderMap.prototype.add = function (names) {
var length = names.length;
if (!length) {
return [];
}
return this.addName(names.slice(0, -1), names[length - 1]);
};
/**
*
*/
OrderMap.prototype.addName = function (names, name) {
var orders = this.get(names) || this.set(names, []);
if (orders.indexOf(name) === -1) {
orders.push(name);
}
return orders;
};
/**
*
*/
OrderMap.prototype.findIndex = function (names, orderName) {
var orders = this.orderMap[this.getFullName(names)];
if (!orders) {
return -1;
}
return orders.indexOf(orderName);
};
/**
*
*/
OrderMap.prototype.remove = function (names) {
var fullName = this.getFullName(names);
var orderMap = this.orderMap;
for (var name_1 in orderMap) {
if (name_1.indexOf(fullName) === 0) {
delete orderMap[name_1];
}
}
var length = names.length;
if (length) {
var prevNames = names.slice(0, -1);
var lastName = names[length - 1];
this.splice(prevNames, this.findIndex(prevNames, lastName), 1);
}
return this;
};
/**
*
*/
OrderMap.prototype.filter = function (names, callback, isFull) {
if (isFull === void 0) { isFull = true; }
var result = this.gets(names, isFull).filter(callback);
var map = new OrderMap(this.separator);
var stack = isFull ? [] : names;
result.forEach(function (nextNames) {
map.add(__spreadArray(__spreadArray([], stack, true), nextNames, true));
});
return map;
};
/**
*
*/
OrderMap.prototype.splice = function (names, index, deleteCount) {
var orders = [];
for (var _i = 3; _i < arguments.length; _i++) {
orders[_i - 3] = arguments[_i];
}
var currentOrders = this.get(names) || this.set(names, []);
currentOrders.splice.apply(currentOrders, __spreadArray([index, deleteCount], orders, false));
return this;
};
/**
*
*/
OrderMap.prototype.clear = function () {
this.orderMap = {};
};
/**
*
*/
OrderMap.prototype.setObject = function (obj) {
var orderMap = this.orderMap;
for (var name_2 in obj) {
orderMap[name_2] = obj[name_2].slice();
}
};
/**
*
*/
OrderMap.prototype.getObject = function () {
var nextMap = {};
var orderMap = this.orderMap;
for (var name_3 in orderMap) {
nextMap[name_3] = orderMap[name_3].slice();
}
return nextMap;
};
/**
*
*/
OrderMap.prototype.clone = function () {
var map = new OrderMap(this.separator);
map.setObject(map.orderMap);
return map;
};
return OrderMap;
}());
module.exports = OrderMap;
exports.default = OrderMap;
//# sourceMappingURL=order-map.cjs.js.map