!7 cprint { transient LineCompedSingle lc; transient LL productions; transient int iFirstFile; transient Map literalIndex; transient MultiMap prodIndex; // keys: item looked for, value: pair(prod index, position in prod) start-thread { new LineCompCompressor comp; lc = lcString2(comp, "hello world world"); // Turn pairs and file encodings into a single structure ("productions") productions = new L; productions.add(rep(null, l(lc.literals))); productions.addAll(intPairsToLists(lc.pairs)); iFirstFile = l(productions); productions.add(lc.main); // build the reconstitution index literalIndex = indexList(lc.literals); prodIndex = new MultiMap; for iProd over productions: { L prod = productions.get(iProd); for (int i, int x : unpair iterateListWithIndex(prod)) { prodIndex.put(x, intPair(iProd, i)); } } print(+literalIndex); print(+prodIndex); S query = "world"; L queryList = characters(query); new L queryLiterals; for (Char c : queryList) { Int iLit = literalIndex.get(c); if (iLit == null) ret with print("literal not found"); queryLiterals.add(iLit); } print(+queryLiterals); reconstitute(queryLiterals, 0); } void reconstitute(L baseList, int i) { L needLeft = subList(baseList, 0, i); L needRight = subList(baseList, i+1); print("Reconstituing " + quote(lcUncompressItem(lc, baseList.get(i))); print(" needLeft: " + quote(lcUncompressItems(lc, needLeft))); print(" needRight: " + quote(lcUncompressItems(lc, needRight))); L l = prodIndex.get(baseList.get(i)); print("Found: " + l); for (IntPair p : l) { } } }