simple-pure-utils
Version:
Funciones puras para manipulación de objetos, arreglos, promesas y observables
102 lines • 8.55 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStringMoves = exports.applyStringMove = void 0;
const logic_1 = require("../../logic");
/**Aplica un movimiento de cadena a una cadena */
function applyStringMove(source, move) {
switch (move.type) {
case "insert":
return source.slice(0, move.index).concat([move.value]).concat(source.slice(move.index, source.length + 1));
case "remove":
return source.slice(0, move.index).concat(source.slice(move.index + 1, source.length + 1));
case "move": {
if (move.sourceIndex == move.destIndex)
return source;
if (move.destIndex > move.sourceIndex) {
return source.slice(0, move.sourceIndex)
.concat(source.slice(move.sourceIndex + 1, move.destIndex + 1))
.concat(source.slice(move.sourceIndex, move.sourceIndex + 1))
.concat(source.slice(move.destIndex + 1, source.length + 1));
}
;
return source.slice(0, move.destIndex)
.concat(source.slice(move.sourceIndex, move.sourceIndex + 1))
.concat(source.slice(move.destIndex, move.sourceIndex))
.concat(source.slice(move.sourceIndex + 1, source.length + 1));
}
case "dup": {
return source.slice(0, move.destIndex)
.concat(source.slice(move.sourceIndex, move.sourceIndex + 1))
.concat(source.slice(move.destIndex, source.length + 1));
}
default:
return (0, logic_1.assertUnreachable)(move);
}
}
exports.applyStringMove = applyStringMove;
/**Obtiene la cantidad mínima de movimientos para llegar de source a dest, considerando los movimientos de "move", "remove", "insert" y "dup" */
function getStringMoves(source, dest, equals) {
const eq = equals || logic_1.referenceEquals;
let i = 0;
let ret = [];
while (i < dest.length) {
if (eq(source[i], dest[i])) {
//Los 2 items encajan, no hay movimientos:
i++;
continue;
}
const destItem = dest[i];
const itemSourceIndex = (0, logic_1.indexOf)(source, x => eq(x, destItem));
if (itemSourceIndex == null) {
//El elemento es nuevo:
const mov = {
type: "insert",
index: i,
value: dest[i]
};
ret.push(mov);
source = applyStringMove(source, mov);
i++;
continue;
}
//El elemento ya existe en source:
//Todos los indices donde aparece el elemento, para ver si está repetido
const itemDestIndices = (0, logic_1.indicesOf)(dest, x => eq(x, destItem));
const repetido = itemDestIndices.length >= 2;
if (repetido) {
const mov = {
type: "dup",
sourceIndex: itemSourceIndex,
destIndex: i
};
ret.push(mov);
source = applyStringMove(source, mov);
i++;
continue;
}
//El elemento no está repetido, es un mov:
{
const mov = {
type: "move",
sourceIndex: itemSourceIndex,
destIndex: itemDestIndices[0],
};
ret.push(mov);
source = applyStringMove(source, mov);
i++;
continue;
}
}
const lastDestIndex = i;
while (i < source.length) {
//Quitar el resto:
ret.push({
type: "remove",
index: lastDestIndex
});
i++;
}
return ret;
}
exports.getStringMoves = getStringMoves;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZVJlbW92ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdHJpbmdzL2Rpc3RhbmNlL21vdmVSZW1vdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXFGO0FBb0NyRixpREFBaUQ7QUFDakQsU0FBZ0IsZUFBZSxDQUFJLE1BQVcsRUFBRSxJQUFxQjtJQUNqRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDZixLQUFLLFFBQVE7WUFDVCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoSCxLQUFLLFFBQVE7WUFDVCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNULElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUztnQkFDbEMsT0FBTyxNQUFNLENBQUM7WUFFbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ25DLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQztxQkFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVB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
;