logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Diffing - Parametric diffing

Documentation

       Module Diffing
        : sigend

       Parametric diffing

       This module implements diffing over lists of arbitrary content.  It is parameterized by

       -The content of the two lists

       -The equality witness when an element is kept

       -The diffing witness when an element is changed

       Diffing  is  extended  to  maintain state depending on the computed changes while walking through the two
       lists.

       The     underlying     algorithm     is      a      modified      Wagner-Fischer      algorithm      (see
       <https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm>).

       We  provide  the  following guarantee: Given two lists l and r , if different patches result in different
       states, we say that the state diverges.

       -We always return the optimal patch on prefixes of l and r on which state does not diverge.

       -Otherwise, we return a correct but non-optimal patch where  subpatches  with  no  divergent  states  are
       optimal for the given initial state.

       More precisely, the optimality of Wagner-Fischer depends on the property that the edit-distance between a
       k-prefix of the left input and a l-prefix of the right input d(k,l) satisfies

       d(k,l) = min ( del_cost + d(k-1,l), insert_cost + d(k,l-1), change_cost + d(k-1,l-1) )

       Under  this  hypothesis, it is optimal to choose greedily the state of the minimal patch transforming the
       left k-prefix into the right l-prefix  as  a  representative  of  the  states  of  all  possible  patches
       transforming the left k-prefix into the right l-prefix.

       If  this  property  is  not  satisfied, we can still choose greedily a representative state. However, the
       computed patch is no more guaranteed to be globally optimal.  Nevertheless, it is still a correct  patch,
       which is even optimal among all explored patches.

       moduletypeDefs=sigend

       The core types of a diffing implementation

       typechange_kind =
        | Deletion
        | Insertion
        | Modification
        | Preservation

       The kind of changes which is used to share printing and styling across implementation

       valprefix : (int*change_kind)Format_doc.printervalstyle : change_kind->Misc.Style.stylelisttype('left,'right,'eq,'diff)change =
        | Delete of'left
        | Insert of'right
        | Keep of'left*'right*'eq
        | Change of'left*'right*'diffvalclassify : ('a,'b,'c,'d)change->change_kindmoduleDefine:(D:Defs)->sigendDefine(Defs)  creates  the  diffing types from the types defined in Defs and the functors that need to be
       instantatied with the diffing algorithm parameters

OCamldoc                                           2025-06-12                                        Diffing(3o)

Module

       Module   Diffing

Name

       Diffing - Parametric diffing

See Also