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()
|
|
|
|
}
|