Enum

Enumeration class. Each enum propertiy has the properties "ordinal", "name" and "text".

Versión del día 4/11/2019. Echa un vistazo a la versión más reciente.

Este script no debería instalarse directamente. Es una biblioteca que utilizan otros scripts mediante la meta-directiva de inclusión // @require https://update.greasyfork.org/scripts/391854/746645/Enum.js

// ==UserScript==
// @name         Enum
// @namespace    hoehleg.userscripts.private
// @version      0.3
// @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 initializing = Symbol("initializing");

    return class EnumBase {

        constructor(processIndicator, { name, ordinal, text } = {}) {
            if (processIndicator !== initializing) {
                throw TypeError("Instantiation of abstract enum class");
            }

            if (typeof text !== "undefined") {
                text = String(text);
            }

            Object.assign(this, {
                get ordinal() { return ordinal; },
                get name() { return name; },
                get text() { return text; }
            });
        }

        valueOf() { 
            return this.ordinal; 
        }

        toString() { 
            return (typeof this.text === "undefined") ? this.name : this.text;
        }

        static init(enumDef = [], firstOrdinal = 0, ordinalSupplier = previousOrdinal => previousOrdinal + 1) {
            if (Object.isFrozen(this)) {
                throw TypeError("Reinitialization of finalized enum class");
            }

            let ordinal;
            const ordinals = [];
            for (let enumDefObj of (Array.isArray(enumDef) ? enumDef : [ enumDef ])) {
                if (typeof enumDefObj !== 'object') {
                    enumDefObj = { [enumDefObj]: undefined };

                }
                for (let [name, text] of Object.entries(enumDefObj)) {
                    ordinal = Number.parseInt((typeof ordinal === "undefined") ? firstOrdinal : ordinalSupplier(ordinal));
                    console.assert(typeof this[name] === "undefined", `duplicate enum [${name}]`);
                    console.assert(typeof this[ordinal] === "undefined", `duplicate ordinal [${ordinal}] for enum [${name}]`);

                    this[name] = new this(initializing, { ordinal, name, text });
                    Object.defineProperty(this, ordinal, { 
                        value: this[name] 
                    });
                    
                    ordinals.push(ordinal);
                }
            }

            const enums = ordinals.sort().map(ordinal => this[ordinal]);
            Object.defineProperty(this, Symbol.iterator, { value: () => enums[Symbol.iterator]() });

            return Object.freeze(this);
        }
    };
})();