Trace_stat_summary_utils.Parallel_foldersSee Trace_stat_summary for an explanation and an example.
Heavily inspired by the "repr" library.
Type parameters:
'res is the output of finalise.'f is the full contructor that creates a 'res.'v is the output of folder.finalise, one parameter of 'f.'rest is 'f or 'res or somewhere in between.'acc is the accumulator of one folder.'row is what needs to be fed to all folder.accumulate.Typical use case:
let pf =
open_ (fun res_a res_b -> my_constructor res_a res_b)
|+ folder my_acc_a my_accumulate_a my_finalise_a
|+ folder my_acc_b my_accumulate_b my_finalise_b
|> seal
in
let res = my_row_sequence |> Seq.fold_left accumulate pf |> finalise inSection 1/3 - Individual folders
val folder :
'acc ->
('acc -> 'row -> 'acc) ->
('acc -> 'v) ->
('row, 'acc, 'v) folderCreate one folder to be passed to an open parallel folder using |+.
Section 2/3 - Open parallel folder
val open_ : 'f -> ('res, 'row, 'f, 'f) open_tStart building a parallel folder.
val app :
('res, 'row, 'f, 'v -> 'rest) open_t ->
('row, 'acc, 'v) folder ->
('res, 'row, 'f, 'rest) open_tAdd a folder to an open parallel folder.
val (|+) :
('res, 'row, 'f, 'v -> 'rest) open_t ->
('row, 'acc, 'v) folder ->
('res, 'row, 'f, 'rest) open_tAlias for app.
Section 3/3 - Closed parallel folder
Stop building a parallel folder.
Gotcha: It may seal a partially applied f.
Forward a row to all registered functional folders.
val finalise : ('res, 'row) t -> 'resFinalise all folders and pass their result to the user-defined function provided to open_.