package blitz.collections fun Iterator.mapModifier(fn: (T) -> R): Iterator = object : Iterator { override fun next(): R = fn(this@mapModifier.next()) override fun hasNext(): Boolean = this@mapModifier.hasNext() } fun generateIterator(fn: () -> T?): Iterator = object: Iterator { var calc = false var nx: T? = null override fun hasNext(): Boolean { if (!calc) { nx = fn() calc = true } return nx != null } override fun next(): T { if (!hasNext()) throw Exception("iterator end") calc = false return nx!! } } /** * Can't explain this function. Look at the source of [blitz.parse.tokenize] as an example */ fun Iterator.funnyMap(fn: (UnGettableIterator) -> R?): Iterator { val iter = asUnGettable() return generateIterator { fn(iter) } } fun Iterator.collect(to: MutableList = mutableListOf()): MutableList { forEachRemaining { to.add(it) } return to } fun Iterator.collect(to: Vec): Vec { forEachRemaining { to.pushBack(it) } return to }