!7 cprint CompressorSpike { switchable S snippetID = #1020763; LinkedHashMap versions; start-thread { print("Snippet ID: " + snippetID); dm_onFieldChange snippetID(r { setField(versions := null); dm_reload() }); if (versions == null) { versions = mapToLinkedHashMap(textChangesOfSnippet(snippetID), sv -> pair(str(sv.versionID), sv.previousValue)); versions.put("latest", loadSnippet(snippetID)); versions = mapValuesToLinkedHashMap toLinesAndBack(versions); // canonicalize line breaks change(); } print("Have " + nVersions(versions) + " with a total of " + nLines(totalLineCount(values(versions)))); new Compressor().run(); } abstract sclass Chunk {} srecord CPair(int i1, int i2) > Chunk {} srecord CPrim(S s) > Chunk {} sclass Compressor { Map textIDToLines = mapValuesToLinkedHashMap lines(versions); Set allUniqueLines; new L chunks; Map lineIndex; run { allUniqueLines = uniquify(concatLists(values(textIDToLines))); for (S line : allUniqueLines) chunks.add(new CPrim(line)); lineIndex = listIndex(collect s(chunks)); for (S id, lines : textIDToLines) { print(id + ": " + joinWithSpace(map(lines, line -> lineIndex.get(line)))); } } } }