Skip to content

Commit 7a7410a

Browse files
committed
Fix Sequence tailRecM StackOverflow
1 parent 0a8deae commit 7a7410a

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

kategory/src/main/kotlin/kategory/data/SequenceKW.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,19 @@ data class SequenceKW<out A> constructor(val sequence: Sequence<A>) : SequenceKW
4242
buf: MutableList<B>,
4343
f: (A) -> HK<SequenceKWHK, Either<A, B>>,
4444
v: SequenceKW<Either<A, B>>) {
45-
if (!v.isEmpty()) {
45+
if (v.sequence.any()) {
4646
val head: Either<A, B> = v.first()
4747
when (head) {
4848
is Either.Right<A, B> -> {
4949
buf += head.b
5050
go(buf, f, v.drop(1).k())
5151
}
52-
is Either.Left<A, B> -> go(buf, f, (f(head.a).ev() + v.drop(1)).k())
52+
is Either.Left<A, B> -> {
53+
if (v.count() == 1)
54+
go(buf, f, (f(head.a).ev()).k())
55+
else
56+
go(buf, f, (f(head.a).ev() + v.drop(1)).k())
57+
}
5358
}
5459
}
5560
}

kategory/src/test/kotlin/kategory/data/SequenceKWTest.kt

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class SequenceKWTest : UnitSpec() {
1414
a.toList() == b.toList()
1515
}
1616

17+
testLaws(MonadLaws.laws(SequenceKW.monad(), eq))
1718
testLaws(MonoidKLaws.laws(SequenceKW.monoidK(), applicative, eq))
1819
testLaws(TraverseLaws.laws(SequenceKW.traverse(), applicative, { n: Int -> SequenceKW(sequenceOf(n)) }, eq))
1920
}

0 commit comments

Comments
 (0)