For funsies, I wanted to emulate Clojure’s head/ta...
# functional
b
For funsies, I wanted to emulate Clojure’s head/tail paradigm for loops/recursion (outside of Arrow/Cons). This is what I came up with. Are there hidden dragons in this seemingly simple thing?
Copy code
// emulate clojure's head/tail splitting in recursive loops
fun <T> Sequence<T>.firstRest(): Pair<T, Sequence<T>> {
    return this@firstRest.iterator().let {
        if (!it.hasNext())
            throw NoSuchElementException("Sequence is empty.")
        Pair(it.next(), it.asSequence())
    }
}

fun testFirstRest() {
    val sOne = listOf(1, 2, 3).asSequence()
    val (one, sTwo) = sOne.firstRest()
    val (two, sThree) = sTwo.firstRest()
    val (three, sEnd) = sThree.firstRest()

    assert(one == 1)
    assert(two == 2)
    assert(three == 3)
    assert(sEnd.none())
}