1. Sebastien Mondet
  2. bufx


bufx /

Filename Size Date modified Message
8 B
365 B
831 B
229 B
2.9 KB
18.6 KB
2.2 KB

Bufx: Passive Buffered Transforms

This mini-library provides (packed in Bufx) the module Transform which implements the API defined in TRANSFORM.

Bufx.Transform.t is a container for buffered transformations over streams modeled in the style of the Cryptokit library for the Biocaml project (see the biocaml application for extensive use —and testing— of the module).

Being “Passive” means that a transform does not pull from a stream, it has to be fed with data; this allows to write stream transformations (like file-formats parsing/printing) that are compatible with both “normal” I/O (like in_channel) and asynchronous libraries (like Lwt_unix or Async_unix).

Composition Functions

The TRANSFORM API provides functions to play Lego with basic Transform.t values in order to build more complex ones. Here are graphical representations of those functions:

<pre>val compose: ('a, 'b) t -> ('b, 'c) t -> ('a, 'c) t</pre> <div class="figure" style="max-width : 50%" title="Compose"> <img src="doc/figures/transform_compose.svg" width="99%"/> </div>

<pre> val mix : ('a1, 'b1) t -> ('a2, 'b2) t -> ('a1 * 'a2, [ both of 'b1 * 'b2 |left of 'b1 | `right of 'b2 ]) t </pre> <div class="figure" style="max-width : 50%" title="Mix"> <img src="doc/figures/transform_mix.svg" width="99%"/> </div>

<pre> val filter_compose: ('il, 'ol) t -> ('ir, 'our) t -> destruct:('ol -> [transform of 'ir |bypass of 'filtered]) -> reconstruct:([bypassed of 'filtered |transformed of 'our] -> 'result) -> ('il, 'result) t </pre> <div class="figure" style="max-width : 50%" title="Filter-Compose"> <img src="doc/figures/transform_filter_compose.svg" width="99%"/> </div>

<pre> val split_and_merge: ('il, 'ol) t -> ('ir, 'our) t -> split:('input -> [left of 'il |right of 'ir]) -> merge:([left of 'ol |right of 'our] -> 'output) -> ('input, 'output) t </pre> <div class="figure" style="max-width : 50%" title="Split and Merge"> <img src="doc/figures/transform_split_merge.svg" width="99%"/> </div>

<pre> val compose_results: on_error:([left of 'error_left |right of 'error_right ] -> 'error) -> ( 'input_left, ('middle, 'error_left) result) t -> ( 'middle, ('output_right, 'error_right) result) t -> ( 'input_left, ('output_right, 'error) result) t </pre> <div class="figure" style="max-width : 50%" title="Compose results"> <img src="doc/figures/transform_compose_results.svg" width="99%"/> </div>

<pre> val compose_result_left: ('input_left, ('middle, 'error) result) t -> ('middle, 'output_right) t -> ('input_left, ('output_right, 'error) result) t </pre> <div class="figure" style="max-width : 50%" title="Compose results on the left"> <img src="doc/figures/transform_compose_result_left.svg" width="99%"/> </div>