persistable sclass HuffmanByteArray is BitIO { settable byte[] data; gettable int[] histogram; gettable HuffmanTreeMaker tm; gettable new HuffmanTree tree; // options settable bool startWithMagicCode; settable S magicCode = "HUF1"; *(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(magicCode); // Part 2 (Huffman character tree) tree.readWrite(head); // Part 3a (size) new VariableSizeUIntForBitHead().chunkSize(3).readWrite(head, -> data.length, size -> data = new byte[size]); //print("length " + data.length); // Part 3 (text) if (head.writeMode()) { fOr (b : data) tree.writeCharacter(b, head); } if (head.readMode()) { for i over data: { if (head.isEOF()) break; data[i] = toUByte(tree.readSymbol(head)); } } } byte[] get() { ret data; } // update selfType public selfType fromByteArray(byte[] data) { BitIO.super.fromByteArray(data); this; } public selfType load(byte[] data) { BitIO.super.load(data); this; } }