Enumeration class. Each enum propertiy has the properties "ordinal", "name" and "text".
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greatest.deepsurf.us/scripts/391854/745818/Enum.js
// ==UserScript==
// @name Enum
// @namespace hoehleg.userscripts.private
// @version 0.1
// @description Enumeration class. Each enum propertiy has the properties "ordinal", "name" and "text".
// @author Gerrit Höhle
// @grant none
// ==/UserScript==
/* jslint esnext: true */
const Enum = (() => {
const add = (thisObj, name, ordinal, text = "") => {
text = String(text);
const enumInstance = new class EnumProperty {
get ordinal() { return ordinal; }
get name() { return name; }
get text() { return text; }
[Symbol.toPrimitive](hint) { return (hint === "number") ? this.ordinal : this.text; }
valueOf() { return this.ordinal; }
toString() { return `object Enum ${this.name}`; }
}();
console.assert(typeof thisObj.name === "undefined", `duplicate enum [${name}]`);
console.assert(typeof thisObj.ordinal === "undefined", `duplicate ordinal [${ordinal}] for enum [${name}]`);
thisObj[name] = thisObj[ordinal] = enumInstance;
};
return class Enum {
constructor(firstOrdinal = 0, ordinalSupplier = previousOrdinal => previousOrdinal + 1) {
this._firstOrdinal = firstOrdinal;
this._ordinalSupplier = ordinalSupplier;
}
init(enumDef = []) {
let ordinal;
const firstOrdinal = this._firstOrdinal;
const ordinalSupplier = this._ordinalSupplier;
Object.getOwnPropertyNames(this).forEach(propName => delete this[propName]);
const ordinals = [];
for (let enumDefObj of (Array.isArray(enumDef) ? enumDef : [ enumDef ])) {
for (let [name, text] of Object.entries(enumDefObj)) {
ordinal = Number.parseInt((typeof ordinal === "undefined") ? firstOrdinal : ordinalSupplier(ordinal));
add(this, name, ordinal, text);
ordinals.push(ordinal);
}
}
const enums = [ ...new Set(ordinals) ].sort().map(ordinal => this[ordinal]);
this[Symbol.iterator] = () => enums[Symbol.iterator]();
return Object.freeze(this);
}
};
})();