Wilhelm Fitzpatrick
11/14/2020, 1:37 AMfun <T> iterate(seed: T, predicate: (T) -> Boolean, transform: (T) -> T): Sequence<T> {
var current = seed
return generateSequence() {
if (!predicate(current)) null
else {
val was = current
current = transform(was)
was
}
}
}
val seq: Sequence<Int> = iterate(0, { it < 1000 }, { it * 2 + 1 })
fun main() { println(seq.toList()) }
[0, 1, 3, 7, 15, 31, 63, 127, 255, 511]
Nir
11/14/2020, 1:45 AMNir
11/14/2020, 1:45 AMephemient
11/14/2020, 1:46 AMval seq = generateSequence(0) { it * 2 + 1 }.takeWhile { it < 1000 }
Wilhelm Fitzpatrick
11/14/2020, 3:24 AMWilhelm Fitzpatrick
11/14/2020, 3:26 AMephemient
11/14/2020, 3:34 AM.drop(1).takeWhile { ... }
ephemient
11/14/2020, 3:36 AMephemient
11/14/2020, 3:38 AM.withIndex().filter { (index, value) -> index == 0 || ... }.map { it.value }
would let the first item pass regardlessephemient
11/14/2020, 3:41 AMsequenceOf(seed) + generateSequence(transform(seed), transform).takeWhile(predicate)
would be clearer most of the time, IMO