variant
Version:
Variant types (a.k.a. Discriminated Unions) in TypeScript
67 lines • 2.47 kB
JavaScript
;
/**
* 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