associativearray
Version:
175 lines (174 loc) • 5.47 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var existjs_1 = require("existjs");
var rndmjs_1 = require("rndmjs");
var Pattern = /** @class */ (function () {
function Pattern() {
this.length = 0;
this.names = [];
this.values = [];
this.id = 0;
this.keys = {};
}
Pattern.prototype.updateKeys = function () {
var keys = {};
for (var i in this.names) {
keys[this.names[i]] = i;
}
this.keys = keys;
};
// Add new element with name
Pattern.prototype.add = function (name, value) {
if (existjs_1.exist(this.keys[name])) {
this.change(name, value);
return;
}
this.names.push(name);
this.values.push(value);
this.length = this.names.length;
this.keys[name] = this.length - 1;
};
// Get value by name
Pattern.prototype.value = function (name) {
return this.values[this.keys[name]];
};
// Add new unnamed element
Pattern.prototype.push = function (value) {
var id = "id" + rndmjs_1.randstr(5) + this.id++;
this.add(id, value);
return id;
};
// Change value by name
Pattern.prototype.change = function (name, value) {
if (!existjs_1.exist(this.keys[name])) {
return;
}
this.values[this.keys[name]] = value;
};
// Remote element by name
Pattern.prototype.remove = function (name) {
if (!existjs_1.exist(this.keys[name])) {
return;
}
if (this.length === 1) {
this.names = [];
this.values = [];
}
else {
this.names.splice(this.keys[name], 1);
this.values.splice(this.keys[name], 1);
}
this.length = this.names.length;
delete this.keys[name];
};
// Get name by value. Only first occurrence.
Pattern.prototype.search = function (value) {
var i = this.values.indexOf(value);
if (i === -1) {
return undefined;
}
return this.names[i];
};
Pattern.prototype.forEach = function (callback) {
for (var i in this.names) {
var breakPoint = callback(this.values[i], this.names[i]);
if (breakPoint === "break") {
break;
}
}
};
// Get string form of all elements
Pattern.prototype.toString = function () {
var trace = "";
for (var i in this.names) {
trace += "[" + this.names[i] + "] " + this.values[i] + "\n";
}
;
return trace;
};
// Change name of element
Pattern.prototype.rename = function (name, newname) {
this.add(newname, this.value(name));
this.remove(name);
};
// Reverse Pattern
Pattern.prototype.reverse = function () {
this.values.reverse();
this.names.reverse();
};
// Copy Pattern
Pattern.prototype.copy = function (pattern) {
this.values = pattern.values.slice();
this.names = pattern.names.slice();
this.length = pattern.length;
this.id = Math.max(this.id, pattern.id);
this.updateKeys();
};
// Share values
Pattern.prototype.share = function (pattern, names) {
for (var _i = 0, names_1 = names; _i < names_1.length; _i++) {
var name_1 = names_1[_i];
pattern.add(name_1, this.values[this.keys[name_1]]);
}
pattern.id = Math.max(pattern.id, this.id);
};
// Get array
Pattern.prototype.array = function () {
var complex = [];
for (var i in this.names) {
complex.push({
name: this.names[i],
value: this.values[i]
});
}
return complex;
};
// Import from array
Pattern.prototype.fromArray = function (array) {
for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
var v = array_1[_i];
this.push(v);
}
};
// Sort Pattern
Pattern.prototype.sort = function (handler) {
var array = this.array();
array.sort(handler);
for (var i in array) {
this.names[i] = array[i].name;
this.values[i] = array[i].value;
}
this.updateKeys();
};
// Shuffle Pattern
Pattern.prototype.shuffle = function () {
var array = this.array();
for (var i = array.length; i; i--) {
var j = Math.floor(Math.random() * i);
_a = [array[j], array[i - 1]], array[i - 1] = _a[0], array[j] = _a[1];
}
for (var i in array) {
this.names[i] = array[i].name;
this.values[i] = array[i].value;
}
this.updateKeys();
var _a;
};
// Concat Pattern
Pattern.prototype.concat = function () {
var patterns = [];
for (var _i = 0; _i < arguments.length; _i++) {
patterns[_i] = arguments[_i];
}
for (var _a = 0, patterns_1 = patterns; _a < patterns_1.length; _a++) {
var pattern = patterns_1[_a];
this.names = this.names.concat(pattern.names);
this.values = this.values.concat(pattern.values);
this.id = Math.max(this.id, pattern.id);
}
this.length = this.names.length;
this.updateKeys();
};
return Pattern;
}());
exports.Pattern = Pattern;