Diffing\_with\_keys(3) OCaml library Diffing\_with\_keys(3)

# [NAME](#NAME)

Diffing\_with\_keys - When diffing lists where each element has a distinct key, we can refine the diffing patch by introducing two composite edit moves: swaps and moves.

# [Module](#Module)

Module Diffing\_with\_keys

# [Documentation](#Documentation)

Module **Diffing\_with\_keys**  
: **sig end**

When diffing lists where each element has a distinct key, we can refine the diffing patch by introducing two composite edit moves: swaps and moves.

**Swap** s exchange the position of two elements. **Swap** cost is set to **2 * change - epsilon** . **Move** s change the position of one element. **Move** cost is set to **delete + addition - epsilon** .

When the cost **delete + addition** is greater than **change** and with those specific weights, the optimal patch with **Swap** s and **Move** s can be computed directly and cheaply from the original optimal patch.

*type* **'a** *with\_pos* = {  
pos : **int** ;  
data : **'a** ;  
}

*val with\_pos* : **'a list -&gt; 'a with\_pos list**

*type* **('l, 'r, 'diff)** *mismatch* =  
| Name **of {**  
pos : **int** ;  
got : **string** ;  
expected : **string** ;  
types\_match : **bool** ;  
}  
| Type **of {**  
pos : **int** ;  
got : **'l** ;  
expected : **'r** ;  
reason : **'diff** ;  
}

*type* **('l, 'r, 'diff)** *change* =  
| Change **of** **('l, 'r, 'diff) mismatch**  
| Swap **of {**  
pos : **int * int** ;  
first : **string** ;  
last : **string** ;  
}  
| Move **of {**  
name : **string** ;  
got : **int** ;  
expected : **int** ;  
}  
| Insert **of {**  
pos : **int** ;  
insert : **'r** ;  
}  
| Delete **of {**  
pos : **int** ;  
delete : **'l** ;  
}

This specialized version of changes introduces two composite changes: **Move** and **Swap**

*val prefix* : **Format.formatter -&gt; ('l, 'r, 'diff) change -&gt; unit**

*module Define :* **functor (D : sig end) -&gt; sig end**

2026-09-15 OCamldoc

---

Document: Diffing_with_keys(3o) from ocaml-4 4.14.4-r3 (Chainguard OS)
Source: https://github.com/ocaml/ocaml
