package octez-internal-libs
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=ddfb5076eeb0b32ac21c1eed44e8fc86a6743ef18ab23fff02d36e365bb73d61
sha512=d22a827df5146e0aa274df48bc2150b098177ff7e5eab52c6109e867eb0a1f0ec63e6bfbb0e3645a6c2112de3877c91a17df32ccbff301891ce4ba630c997a65
doc/octez-internal-libs.irmin/Irmin/Merge/index.html
Module Irmin.Merge
Source
Merge
provides functions to build custom 3-way merge operators for various user-defined contents.
Merge operators.
The type for merge errors.
Return Error (Conflict str)
.
bind r f
is the merge result which behaves as of the application of the function f
to the return value of r
. If r
fails, bind r f
also fails, with the same conflict.
map f m
maps the result of a merge. This is the same as bind m (fun x -> ok (f x))
.
Merge Combinators
An 'a
promise is a function which, when called, will eventually return a value type of 'a
. A promise is an optional, lazy and non-blocking value.
map_promise f a
is the promise containing f
applied to what is promised by a
.
bind_promise a f
is the promise returned by f
applied to what is promised by a
.
Signature of a merge function. old
is the value of the least-common ancestor.
/----> t1 ----\ ----> old |--> result \----> t2 ----/
The type for merge combinators.
Call the merge functions in sequence. Stop as soon as one is not returning a conflict.
Use the merge function defined in another domain. If the converting functions raise any exception the merge is a conflict.
with_conflict f m
is m
with the conflict error message modified by f
.
Same as biject but with blocking domain converting functions.
Basic Merges
default t
is the default merge function for values of type t
. This is a simple merge function which supports changes in one branch at a time:
- if
t1=old
then the result of the merge isOK t2
; - if
t2=old
then returnOK t1
; - otherwise the result is
Conflict
.
idempotent t
is the default merge function for values of type t
using idempotent operations. It follows the same rules as the default
merge function but also adds:
- if
t1=t2
then the result of the merge isOK t1
.
The default string merge function. Do not do anything clever, just compare the strings using the default
merge function.
Lift a merge function to optional values of the same type. If all the provided values are inhabited, then call the provided merge function, otherwise use the same behavior as default
.
Lift merge functions to triples of elements.
Counters and Multisets
The type for counter values. It is expected that the only valid operations on counters are increment and decrement. The following merge functions ensure that the counter semantics are preserved: i.e. it ensures that the number of increments and decrements is preserved.
Maps and Association Lists
We consider the only valid operations for maps and association lists to be:
- Adding a new bindings to the map.
- Removing a binding from the map.
- Replacing an existing binding with a different value.
- Trying to add an already existing binding is a no-op.
We thus assume that no operation on maps is modifying the key names. So the following merge functions ensures that (i) new bindings are preserved (ii) removed bindings stay removed and (iii) modified bindings are merged using the merge function of values.
Note: We only consider sets of bindings, instead of multisets. Application developers should take care of concurrent addition and removal of similar bindings themselves, by using the appropriate multi-sets.
Lift the merge functions to association lists.
Lift the merge functions to maps.