disbrowser/src/commonMain/kotlin/com/smallhacker/util/ImmStack.kt

38 lines
821 B
Kotlin
Raw Normal View History

2019-01-20 10:11:30 +00:00
package com.smallhacker.util
2019-01-07 18:19:37 +00:00
interface ImmStack<E>: Iterable<E> {
fun isEmpty(): Boolean
val top: E?
fun pop(): ImmStack<E>
fun push(value: E): ImmStack<E> = ImmStackImpl(this, value)
}
fun <T> immStack(): ImmStack<T> {
@Suppress("UNCHECKED_CAST")
return EmptyImmStack as ImmStack<T>
}
2019-01-19 22:13:41 +00:00
private class ImmStackImpl<E>(private val parent: ImmStack<E>, override val top: E):
ImmStack<E> {
2019-01-07 18:19:37 +00:00
override fun isEmpty() = false
override fun pop(): ImmStack<E> = parent
override fun iterator(): Iterator<E> {
return sequenceOf(top).plus(parent).iterator()
}
}
private object EmptyImmStack: ImmStack<Any?> {
override fun isEmpty() = true
override val top: Any? = null
override fun pop() = this
override fun iterator() = emptySequence<Any?>().iterator()
}