UNPKG

variant

Version:

Variant types (a.k.a. Discriminated Unions) in TypeScript

67 lines 2.47 kB
"use strict"; /** * What should a progression do? * * - Be able to create a variant * - maybe this isn't necessary. * - do a .compare(a: T, b: T) and get back a number; */ Object.defineProperty(exports, "__esModule", { value: true }); exports.sequence = exports.CompareResult = void 0; const remote_1 = require("./remote"); const variant_1 = require("./variant"); var CompareResult; (function (CompareResult) { CompareResult[CompareResult["Lesser"] = -1] = "Lesser"; CompareResult[CompareResult["Equal"] = 0] = "Equal"; CompareResult[CompareResult["Greater"] = 1] = "Greater"; })(CompareResult = exports.CompareResult || (exports.CompareResult = {})); ; function _sequenceFromScratch(list) { const mod = variant_1.variantList(list); const order = list.map(i => getType(i)); const seq = sequence(mod, order); return seq; } function _sequence(vmod, order) { let rawStringOrder = order.map(i => typeof i === 'string' ? i : i.type); const restrictedVmod = Object.keys(vmod).reduce((acc, key) => { return Object.assign(Object.assign({}, acc), { [key]: vmod[key] }); }, {}); const keyType = Object.values(vmod)[0].key; return Object.assign(Object.assign({}, remote_1.remote(restrictedVmod, keyType)), { length: order.length, compare: (a, b) => { const ai = rawStringOrder.findIndex(i => i === getType(a, keyType)); const bi = rawStringOrder.findIndex(i => i === getType(b, keyType)); const diff = ai - bi; return diff === 0 ? diff : (diff / Math.abs(diff)); }, get(i) { const type = this.types[i]; return this.new[type]; }, index: a => rawStringOrder.findIndex(i => i === getType(a)), types: rawStringOrder }); } function sequence(...args) { if (Array.isArray(args[0])) { const [list] = args; return _sequenceFromScratch(list); } else { const [vmod, list] = args; return _sequence(vmod, list); } } exports.sequence = sequence; function getType(object, typeKey) { const key = typeKey !== null && typeKey !== void 0 ? typeKey : 'type'; if (typeof object === 'string') { return object; } else { if (typeof object === 'function') { return object.type; } else { return object[key]; } } } //# sourceMappingURL=sequence.js.map