From 47668a2e28459bf450ee22672b1f5e1d5e5e74c2 Mon Sep 17 00:00:00 2001 From: Miha-x64 Date: Mon, 20 Jun 2022 16:02:57 +0300 Subject: [PATCH] MORE BREAKING: kotlin-centric `add[All](what, at = size)` functions --- .../net/aquadc/delegapter/Delegapter.kt | 31 ++++++---- .../aquadc/delegapter/MutableDelegapter.kt | 59 +++++++++---------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/delegapter/src/main/kotlin/net/aquadc/delegapter/Delegapter.kt b/delegapter/src/main/kotlin/net/aquadc/delegapter/Delegapter.kt index 7be5ff2..28e5b1f 100644 --- a/delegapter/src/main/kotlin/net/aquadc/delegapter/Delegapter.kt +++ b/delegapter/src/main/kotlin/net/aquadc/delegapter/Delegapter.kt @@ -4,6 +4,7 @@ package net.aquadc.delegapter import android.view.ViewGroup import androidx.recyclerview.widget.ListUpdateCallback import androidx.recyclerview.widget.RecyclerView +import net.aquadc.delegapter.decor.DelegatePredicate /** * Data structure for holding (delegate, item) pairs with agreed types. @@ -16,14 +17,9 @@ abstract class Delegapter protected constructor(initialCapacity: Int) { // common mutable interface - fun add(delegate: DiffDelegate, item: D): Boolean = - addAt(items.size, delegate, item) - abstract fun addAt(index: Int, delegate: DiffDelegate, item: D): Boolean - abstract fun set(index: Int, delegate: DiffDelegate, item: D): Boolean - - fun addAll(delegate: DiffDelegate, items: Collection): Boolean = - addAllAt(this.items.size, delegate, items) - abstract fun addAllAt(index: Int, delegate: DiffDelegate, items: Collection): Boolean + abstract fun add(delegate: DiffDelegate, item: D, atIndex: Int = size): Boolean + abstract fun set(delegate: DiffDelegate, item: D, atIndex: Int): Boolean + abstract fun addAll(delegate: DiffDelegate, items: Collection, atIndex: Int = size): Boolean // use like a List @@ -61,6 +57,19 @@ abstract class Delegapter protected constructor(initialCapacity: Int) { } return -1 } + fun indexOf( + delegate: Delegate, + startIndex: Int = 0, direction: Int = 1, + ): Int { + require(direction != 0) + var i = startIndex + while (i in 0 until size) { + if (delegate == itemDelegates[i]) + return i + i += direction + } + return -1 + } // debug @@ -88,8 +97,8 @@ inline fun Delegapter( typealias Delegate = (parent: ViewGroup) -> VH<*, *, D> -inline fun Delegapter.indexOf( - delegate: (Delegate<*>) -> Boolean, item: (Any?) -> Boolean, +inline fun Delegapter.findIndexOf( + delegate: DelegatePredicate, item: (Any?) -> Boolean, startIndex: Int = 0, direction: Int = 1, ): Int { require(direction != 0) @@ -102,7 +111,7 @@ inline fun Delegapter.indexOf( return -1 } -@JvmName("indexOfByDelegate") inline fun Delegapter.indexOf( +inline fun Delegapter.findIndexOfBy( noinline delegate: Delegate, item: (D) -> Boolean, startIndex: Int = 0, direction: Int = 1, ): Int { diff --git a/delegapter/src/main/kotlin/net/aquadc/delegapter/MutableDelegapter.kt b/delegapter/src/main/kotlin/net/aquadc/delegapter/MutableDelegapter.kt index c523a36..856955f 100644 --- a/delegapter/src/main/kotlin/net/aquadc/delegapter/MutableDelegapter.kt +++ b/delegapter/src/main/kotlin/net/aquadc/delegapter/MutableDelegapter.kt @@ -40,36 +40,32 @@ class MutableDelegapter( // configure like a MutableList - fun add(delegate: Delegate, item: D): Boolean = - addAt(items.size, delegate, item) - override fun addAt(index: Int, delegate: DiffDelegate, item: D): Boolean = - addAt(index, delegate as Delegate, item) - fun addAt(index: Int, delegate: Delegate, item: D): Boolean { - items.add(index, item) - itemDelegates.add(index, delegate) - target.onInserted(index, 1) + override fun add(delegate: DiffDelegate, item: D, atIndex: Int): Boolean = + add(delegate as Delegate, item, atIndex) + @JvmOverloads fun add(delegate: Delegate, item: D, atIndex: Int = size): Boolean { + items.add(atIndex, item) + itemDelegates.add(atIndex, delegate) + target.onInserted(atIndex, 1) return tryAddDelegate(delegate) } - override fun set(index: Int, delegate: DiffDelegate, item: D): Boolean = - set(index, delegate as Delegate, item) - @JvmOverloads fun set(index: Int, delegate: Delegate, item: D, payload: Any? = null): Boolean { - items[index] = item - itemDelegates[index] = delegate - target.onChanged(index, 1, payload) + override fun set(delegate: DiffDelegate, item: D, atIndex: Int): Boolean = + set(delegate as Delegate, item, atIndex) + @JvmOverloads fun set(delegate: Delegate, item: D, atIndex: Int, payload: Any? = null): Boolean { + items[atIndex] = item + itemDelegates[atIndex] = delegate + target.onChanged(atIndex, 1, payload) return tryAddDelegate(delegate) } - fun addAll(delegate: Delegate, items: Collection): Boolean = - addAllAt(this.items.size, delegate, items) - override fun addAllAt(index: Int, delegate: DiffDelegate, items: Collection): Boolean = - addAllAt(index, delegate as Delegate, items) - fun addAllAt(index: Int, delegate: Delegate, items: Collection): Boolean = + override fun addAll(delegate: DiffDelegate, items: Collection, atIndex: Int): Boolean = + addAll(delegate as Delegate, items, atIndex) + @JvmOverloads fun addAll(delegate: Delegate, items: Collection, atIndex: Int = size): Boolean = if (items.isEmpty()) false else { - this.items.addAll(index, items) + this.items.addAll(atIndex, items) (repeat ?: RepeatList>().also { repeat = it }) - .of(delegate, items.size) { itemDelegates.addAll(index, it) } - target.onInserted(index, items.size) + .of(delegate, items.size) { itemDelegates.addAll(atIndex, it) } + target.onInserted(atIndex, items.size) tryAddDelegate(delegate) } @@ -139,22 +135,21 @@ class MutableDelegapter( } inner class DiffDelegapter @PublishedApi internal constructor(initialCapacity: Int) : Delegapter(initialCapacity) { - override fun addAt(index: Int, delegate: DiffDelegate, item: D): Boolean { - items.add(index, item) - itemDelegates.add(index, delegate) + override fun add(delegate: DiffDelegate, item: D, atIndex: Int): Boolean { + items.add(atIndex, item) + itemDelegates.add(atIndex, delegate) return tryAddDelegate(delegate) } - override fun set(index: Int, delegate: DiffDelegate/*, payload: Any? = null*/, item: D): Boolean { - items[index] = item - itemDelegates[index] = delegate + override fun set(delegate: DiffDelegate, item: D, atIndex: Int): Boolean { + items[atIndex] = item + itemDelegates[atIndex] = delegate return tryAddDelegate(delegate) } - - override fun addAllAt(index: Int, delegate: DiffDelegate, items: Collection): Boolean = + override fun addAll(delegate: DiffDelegate, items: Collection, atIndex: Int): Boolean = if (items.isEmpty()) false else { - this.items.addAll(index, items) + this.items.addAll(atIndex, items) (repeat ?: RepeatList>().also { repeat = it }) - .of(delegate, items.size) { itemDelegates.addAll(index, it) } + .of(delegate, items.size) { itemDelegates.addAll(atIndex, it) } tryAddDelegate(delegate) }