Kotlin Multiplatform library implements iterative Myers algorithm for diff calculations without the second pass for moves detection.
The algorithm is implemented in common source set, so it can be used in any supported platform.
The main part of the algorithm implementation is rewritten to Kotlin from the Android Java library - DiffUtil.
| Library version | Kotlin version |
|---|---|
| 1.2.0 | 1.4.0 |
| 1.1.0 | 1.3.72 |
| 1.0.0 | 1.3.61 |
In root build.gradle.kts add the maven repository url:
allprojects { repositories { maven { url = uri("https://dl.bintray.com/tetraquark/kmplibs") } } }or in root build.gradle
allprojects { repositories { maven { url "https://dl.bintray.com/tetraquark/kmplibs" } } }Then in a project build.gradle.kts:
dependencies { implementation("ru.tetraquark.kmplibs:MyersDiffKt:1.2.0") }or in a project build.gradle:
dependencies { implementation "ru.tetraquark.kmplibs:MyersDiffKt:1.2.0" }To calculate difference for two lists, use DiffUtil singleton object. There are two public functions:
suspend fun diffFlow( oldListSize: Int, newListSize: Int, comparator: (oldItemIndex: Int, newItemIndex: Int) -> Boolean ): Flow<Change>fun diffCallback( oldListSize: Int, newListSize: Int, comparator: (oldItemIndex: Int, newItemIndex: Int) -> Boolean ): DiffResultdiffFlow function is suspendable and returns Flow instance, so difference calculations can be implemented in asynchronus style using Kotlin coroutines.
diffCallback function returns DiffResult object that holds a calculation results.
Use example for diffFlow function:
launch { DiffUtil.diffFlow(oldList.size, newList.size) { oldItemIndex, newItemIndex -> oldList[oldItemIndex] == newList[newItemIndex] } .flowOn(Dispatchers.Default) .collect { change -> applyChangeToLists(resultList, newList, change) } }There is simple example of Android application in sample-android module that uses the library to calculating and applying differences for RecyclerView content.