simple-pure-utils
Version:
Funciones puras para manipulación de objetos, arreglos, promesas y observables
97 lines • 8.38 kB
JavaScript
import { assertUnreachable, referenceEquals, indexOf, indicesOf } from "../../logic";
/**Aplica un movimiento de cadena a una cadena */
export 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 assertUnreachable(move);
}
}
/**Obtiene la cantidad mínima de movimientos para llegar de source a dest, considerando los movimientos de "move", "remove", "insert" y "dup" */
export function getStringMoves(source, dest, equals) {
const eq = equals || 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 = 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 = 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;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZVJlbW92ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdHJpbmdzL2Rpc3RhbmNlL21vdmVSZW1vdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBb0NyRixpREFBaUQ7QUFDakQsTUFBTSxVQUFVLGVBQWUsQ0FBSSxNQUFXLEVBQUUsSUFBcUI7SUFDakUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2YsS0FBSyxRQUFRO1lBQ1QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsS0FBSyxRQUFRO1lBQ1QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDVCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQ2xDLE9BQU8sTUFBTSxDQUFDO1lBRWxCLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNuQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQzlELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ25FO1lBQUEsQ0FBQztZQUVGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDdEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUM3RDtTQUNSO1FBQ0QsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNSLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM1RCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0s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