unordered_fold i ~init ~add ~remove
constructs a more incremental version of:
let%map m = i in
Map.fold m ~init ~f:add
assuming that remove
is the inverse of add
, and that the operations for different keys can be performed in any order. Note that data_equal
defaults to phys_equal
, but a more precise equality can be provided instead.
When the data for a key updates, by default remove
is called on the old data and then add
is called on the new data. update
provides an alternative single function to call each time a key's data updates, and can be used to improve efficiency.
For the initial computation, by default add
is called on all the elements in the map. As this can be inefficient, specialized_initial
can be provided to perform the computation in a more effective way.
If revert_to_init_when_empty
is true, then if the input map transitions from being full to empty, then instead of calling remove
on every kv-pair, it will instead just set the output to whatever you've passed as init
. The default value of revert_to_init_when_empty
is false
, so this optimization does not apply automatically.
finalize
defaults to Fn.id
is called immediately before the accumulator value is stored and returned during stabilization. You can use it to e.g. process the fold operations in a different order.