package decompress
Install
    
    dune-project
 Dependency
Authors
Maintainers
Sources
sha256=822f125b46c87f4a902c334db8c86d4d5f33ebe978e93c40351a4d3269b95225
    
    
  sha512=9cb82615923a5fffc5c8dce1d9361a467e35e91092c25c98f5afda8f4226059c59eb695c55e63adf92d766c7747e15df186386bcaeb399497dd1ae5b024c09fa
    
    
  doc/decompress.de/De/Def/index.html
Module De.DefSource
The type for output destinations. With a `Manual destination the client must provide output storage with dst. With `String or `Channel destination the client can safely discard `Flush case (with assert false).
The type for DEFLATE DYNAMIC block.
type kind = - | Flat of int(*- A *)- Flat lenblock is a non-compressed block of- lenbyte(s). After a flat block, output is aligned on bytes.
- | Fixed(*- A *)- Fixedblock is a compressed block by a precomputed Huffman tree. Any symbols can be encoded with this kind of block -- encodeshould never return- `Blockwith it.
- | Dynamic of dynamic(*- A *)- Dynamic hblock is a compressed block by an Huffman tree represented by- h. It allows to encode a subset of symbols (or any symbols).
The type for DEFLATE header block.
dynamic_of_frequencies ~literals ~distances is a DEFLATE DYNAMIC block header computed from given frequencies. According frequencies, dynamic_of_frequencies makes a Huffman tree which provides smaller representation for symbols which frequency is upper than 0 (others symbols are not a part of resulted Huffman tree). At the end, a dynamic Huffman tree is able to encode a subset of symbols.
If all frequencies are upper than 0, resulted dynamic Huffman tree is able to encode any symbols.
The type for DEFLATE encoders.
encoder dst ~q is an encoder that outputs to dst.
Internal queue.
encoder needs a side-channel about compressed inputs. To pass compression values to encoder, we use a queue q. Length of it can be a bottleneck where a small one will let encode to emit too many `Flush (which is commonly associated to a syscall). We recommend a queue as large as output buffer.
encode e v is:
- `Partialiff- ehas a- `Manualdestination and needs more output storage. The client must use- dstto provide a new buffer and then call- encodewith- `Awaituntil- `Okis returned.
- `Okwhen the encoder is ready to encode a new- encodeaction.
- `Blockwhen the encoder reachs a- Queue.cmdwhich can not be encoded with the current- block. The client must respond with- `Block blockwhere- blockis a new block able to encode current- Queue.cmd.
How to signal end of flow?
End of flow is characterized by a block where last = true. Then, the client must emit into the queue q Queue.eob.
Limitation.
The encoder must manipulate an output buffer of, at least, 2 bytes. If it's not the case, encode does nothing - and it tells you nothing more than it did nothing. Depending on what you do, a loop can infinitely call encode without any updates until the given output still has less than 2 bytes.
dst e s j l provides e with l bytes available to write, starting at j in s. This byte range is read by calls to encode with e until `Flush is returned.
bits_rem e is how many bits it remains in given output buffer. A DEFLATE flow is not necessary aligned on bytes. The client can call bits_rem only when he reachs `End case. Otherwise, we raises an Invalid_argument.