persistable sclass HuffmanByteArray is BitIO { settable byte[] data; gettable int[] histogram; gettable HuffmanTreeMaker tm; gettable new HuffmanTree tree; // options settable bool startWithMagicCode; *(byte[] *data) {} public void readWrite(BitHead head) { if (head.writeMode() && histogram == null) { histogram = byteHistogramArray(data); tm = new HuffmanTreeMaker; tm.importByteHistogram(histogram); tree = tm!; } // Part 1 (magic code) if (startWithMagicCode) head.exchangeASCII("HUFF"); // Part 2 (Huffman character tree) tree.readWrite(head); head.finishByte(true); // Part 3a (size) head.exchangeInt(-> data.length, size -> data = new byte[size]); print("length " + data.length); // Part 3 (text) if (head.writeMode()) { fOr (b : data) tree.writeCharacter(b, head); //head.trailingBitCount(true); } if (head.readMode()) { for i over data: data[i] = toUByte(tree.readSymbol(head)); } } byte[] get() { ret data; } // update selfType public selfType fromByteArray(byte[] data) { BitIO.super.fromByteArray(data); this; } }