#6. реализация односвязного списка.

Приветствую читатель!

Сегодня приведу пример реализации односвязного списка на Kotlin.

Листинг из книги: Пьер-Ив Симон: Волшебство Kotlin

Kotlin
fun main() {
    
    val list = List(1, 2, 3)
    println(list)
    
}

sealed class List<A> {

    abstract fun isEmpty(): Boolean

    private object Nil : List<Nothing>() {
        override fun isEmpty() = true

        override fun toString() = "[NIL]"
    }

    private class Cons<A>(
        val head: A,
        val tail: List<A>
    ) : List<A>() {
        override fun isEmpty() = false
        override fun toString() = "[${toString("", this)}NIL]"


        private tailrec fun toString(acc: String, list: List<A>): String =
            when (list) {
                is Nil -> acc
                is Cons -> toString("$acc${list.head}, ", list.tail)
            }
    }

    companion object {
        operator
        fun <A> invoke(vararg az: A): List<A> =
            az.foldRight(Nil as List<A>) { a: A, list: List<A> ->
                Cons(a, list)
            }
    }

}