middleout.js
Version:
A spoof compression library that pretends to revolutionize data compression using made-up algorithms — inspired by the legendary middle-out compression from Silicon Valley
67 lines (64 loc) • 1.66 kB
JavaScript
import {
decodeMO,
encodeMO
} from "./chunk-EKQOSSOR.js";
import {
getWeissmanScore
} from "./chunk-MRISBIOS.js";
// src/algorithms/rle.ts
function compressWithRLE(input, config) {
const preserveWhitespace = config?.preserveWhitespace ?? true;
const cleanedInput = preserveWhitespace ? input : input.replace(/\s+/g, "");
let compressed = "";
let count = 1;
for (let i = 0; i < cleanedInput.length; i++) {
const current = cleanedInput[i];
const next = cleanedInput[i + 1];
if (current == next) {
count++;
} else {
compressed += current + (count > 1 ? count : "");
count = 1;
}
}
const targetWeissman = config?.targetWeissman || 10;
const weissmanScore = getWeissmanScore(
"rle",
input.length,
compressed.length,
targetWeissman
);
return {
original: input,
compressed,
originalSize: input.length,
compressedSize: compressed.length,
algorithm: "rle",
weissmanScore,
encoded: encodeMO("rle", compressed, weissmanScore)
};
}
function decompressWithRLE(encoded) {
const { algorithm, compressedData } = decodeMO(encoded);
if (algorithm !== "rle") {
throw new Error(
`decompressWithRLE expected algorithm 'rle' but got '${algorithm}'`
);
}
let result = "";
for (let i = 0; i < compressedData.length; i++) {
const char = compressedData[i];
let numStr = "";
while (/\d/.test(compressedData[i + 1])) {
numStr += compressedData[++i];
}
const count = parseInt(numStr || "1", 10);
result += char.repeat(count);
}
return result;
}
export {
compressWithRLE,
decompressWithRLE
};