class ResultSetSequence(private val queryIterator: QueryIterator): Sequence { override fun iterator() = queryIterator fun close() = queryIterator.close() } class QueryIterator(val qs: ResultSetState, val rs: ResultSet, val mapper: (ResultSet) -> T, val autoClose: Boolean ) : Iterator, AutoCloseable { private var didNext = false private var hasNext = false private val cancelled = AtomicBoolean(false) override fun next(): T { if (!didNext) { rs.next() } didNext = false return mapper(rs) } override fun hasNext(): Boolean { if (cancelled.get()) { excecuteCancel() hasNext = false return false } if (!didNext) { hasNext = rs.next() didNext = true } if (!hasNext) close() return hasNext } fun asIterable() = object: Iterable { override fun iterator(): Iterator = this@QueryIterator } override fun close() { rs.close() qs.statement?.close() if (autoClose) qs.connection?.close() } fun cancel() { cancelled.set(true) } private fun excecuteCancel() { rs.close() qs.statement?.close() if (autoClose) qs.connection?.close() } }