De.DefThe 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).
type kind = | Flat of int | (* A |
| Fixed | (* A |
| Dynamic of dynamic | (* A |
The type for DEFLATE header block.
The type for DEFLATE 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.
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:
`Partial iff e has a `Manual destination and needs more output storage. The client must use dst to provide a new buffer and then call encode with `Await until `Ok is returned.`Ok when the encoder is ready to encode a new encode action.`Block when the encoder reachs a Queue.cmd which can not be encoded with the current block. The client must respond with `Block block where block is 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.
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.
val dst_rem : encoder -> intdst_rem e is how many bytes it remains in given output buffer.
val bits_rem : encoder -> intbits_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.