groostav
01/13/2017, 4:16 AMclass TokenSeqSourcedCharSequence(val tokens: Sequence<TextFileToken>) : CharSequence {
var cursorIndex = 0;
var iterated: Sequence<TextFileToken> = tokens
//slow!!!
override val length: Int = tokenCount
override fun get(index: Int): Char {
moveTo(index)
val value = iterated.firstOrNull() ?: throw IndexOutOfBoundsException()
return value.asSingleChar()
}
override fun subSequence(startIndex: Int, endIndexExclusive: Int): CharSequence {
moveTo(startIndex)
val values = iterated.take(endIndexExclusive - startIndex)
return CachedCharSequence(TokenSeqSourcedCharSequence(values))
}
private fun moveTo(index: Int) {
if (index > cursorIndex) {
val delta = index - cursorIndex
iterated = iterated.drop(delta)
cursorIndex = index
}
else {
iterated = tokens.drop(index)
cursorIndex = index
}
}
override fun toString(): String = tokens
.map { it.asSingleChar() }
.fold(StringBuilder()) { builder, next -> builder.apply { append(next) } }
.toString()
}