UNPKG

simple-pure-utils

Version:

Funciones puras para manipulación de objetos, arreglos, promesas y observables

97 lines 8.38 kB
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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