package a import java.* import java.util.* ///////////////////////////////////////////////////////////////////////// fun done(result : O) : Iteratee = StrangeIterateeImpl(result) abstract class Iteratee { abstract fun process(item : I) : Iteratee abstract val isDone : Boolean abstract val result : O abstract fun done() : O } class StrangeIterateeImpl(val obj: O) : Iteratee { override fun process(item: I): Iteratee = StrangeIterateeImpl(obj) override val isDone = true override val result = obj override fun done() = obj } abstract class Sum() : Iteratee { override fun process(item : Int) : Iteratee { return a.done(item); } abstract override val isDone : Boolean abstract override val result : Int abstract override fun done() : Int } abstract class Collection : Iterable { fun iterate(var iteratee : Iteratee) : O { for (x in this) { val it = iteratee.process(x) if (it.isDone) return it.result iteratee = it } return iteratee.done() } }