Skip to content

Instantly share code, notes, and snippets.

@green-nick
Last active August 16, 2019 08:20
Show Gist options
  • Save green-nick/095e969c0383dc28fe5fdeeb35afe909 to your computer and use it in GitHub Desktop.
Save green-nick/095e969c0383dc28fe5fdeeb35afe909 to your computer and use it in GitHub Desktop.
Observable list
private open class MutableListWrapper<T>(private val source: MutableList<T>) : AbstractMutableList<T>() {
override val size get() = source.size
override fun add(index: Int, element: T) = source.add(index, element)
override fun get(index: Int) = source[index]
override fun removeAt(index: Int) = source.removeAt(index)
override fun set(index: Int, element: T) = source.set(index, element)
override fun toString() = source.toString()
}
fun <T> MutableList<T>.onAdd(onAdded: (element: T) -> Unit): MutableList<T> =
onAdd { _, element -> onAdded(element) }
fun <T> MutableList<T>.onSet(onSet: (previous: T, new: T) -> Unit): MutableList<T> =
onSet { _, old, new -> onSet(old, new) }
fun <T> MutableList<T>.onRemove(onRemoved: (element: T) -> Unit): MutableList<T> =
onRemove { _, element -> onRemoved(element) }
fun <T> MutableList<T>.onAdd(onAdded: (index: Int, element: T) -> Unit): MutableList<T> =
object : MutableListWrapper<T>(this) {
override fun add(index: Int, element: T) {
super.add(index, element)
onAdded(index, element)
}
}
fun <T> MutableList<T>.onSet(onSet: (index: Int, previous: T, new: T) -> Unit): MutableList<T> =
object : MutableListWrapper<T>(this) {
override fun set(index: Int, element: T) =
super.set(index, element)
.also { onSet(index, it, element) }
}
fun <T> MutableList<T>.onRemove(onRemoved: (index: Int, element: T) -> Unit): MutableList<T> =
object : MutableListWrapper<T>(this) {
override fun removeAt(index: Int) =
super.removeAt(index)
.also { onRemoved(index, it) }
}
val list = mutableListOf<String>()
.onAdd { index, element -> println("added [$element] into $index") }
.onAdd { element -> println("added [$element]") }
.onSet { index, previuos, new -> println("replace previuos [$previuos] with new [$new] at $index") }
.onSet { previuos, new -> println("replace previuos [$previuos] with new [$new]") }
.onRemove { index, element -> println("remove [$element] from $index") }
.onRemove { element -> println("remove [$element]") }
fun main() = with(list) {
add("Hello")
// added [Hello] into 0
// added [Hello]
add("world")
// added [world] into 1
// added [world]
set(1, "everybody")
// replace old [world] with new [everybody] at 1
// replace old [world] with new [everybody]
addAll(listOf("who", "is", "there"))
// added [who] into 2
// added [who]
// added [is] into 3
// added [is]
// added [there] into 4
// added [there]
removeAt(0)
// remove [Hello] from 0
// remove [Hello]
println(this)
// [everybody, who, is, there]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment