API/Enumerable.js

//eslint-disable-next-line no-unused-vars
const { List } = require("./List"); //lgtm [js/unused-local-variable] JSDoc Type Def
//TODO #145 This Likely needs a rework in the library
/**
 * @template T.
 * @class Enumerable
 * @augments {Object}
 * @returns {Enumerable}
 * @param {Array<string>|List<string>|T} $b
 */
class Enumerable extends Object {
	constructor($b) {
		if ($b == null) throw new Error("No Data Given");
		super();
		let keys;
		let i;
		switch ($b.constructor.name) {
		case "Array":
		case "List":
			keys = $b;
			for (i = 0; i < keys.length; i++) {
				this[keys[i]] = i;
			}
			break;
		case "Object":
			keys = Object.keys($b);
			for (i = 0; i < keys.length; i++) {
				this[keys[i]] = $b[[keys[i]]]; //lgtm [js/implicit-operand-conversion]
			}
			break;
		default:
			throw new Error("Invalid Data, Expected type: <Array, List, Object>");
		}
		Object.freeze(this);
	}
	/**.
	 * Get Value Set on Init
	 *
	 * @param {String} key
	 * @returns {number}
	 * @instance
	 * @memberof Enumerable
	 */
	GetValue(key) {
		return this[key];
	}
	/**.
	 * JS Int to Enum Value
	 *
	 * @param {*} val
	 * @returns {Enumerable}
	 * @memberof Enumerable
	 */
	FromNumber(val) {
		let keys = Object.keys(this);
		if (keys.length - 1 < val) throw Error("Index larger than enum");
		if (this[keys[val]] != null) {
			return keys[val];
		}
	}
	/**
	 * @deprecated
	 * @private
	 * @param {Enumerable} Enum
	 */
	FromEnum(Enum) {
		let keys = Object.keys(Enum).shift();
		if (Enum > keys.length) throw new Error("Bounds Exceeded");
		for (let i = 0; i < keys.length; i++) {
			if (this[keys[i]] === Enum) return keys[i];
		}
		throw new Error("Value not Found");
	}
}
module.exports = {
	Enumerable,
};