我找到了一个解决方案:
implicit class JumpIO[A, B](io: IO[A, (B, Boolean)]) {
def mightJumpNext(next: B => IO[A, B]): IO[A, B] = {
io.flatMap { case (b, test) =>
if (test) {
io.map { case (bb, _) => bb }
} else {
io.flatMap { case (bb, _) => next(bb) }
}
}
}
def mightJumpNextChain(next: B => IO[A, (B, Boolean)]): IO[A, (B, Boolean)] = {
io.flatMap { case (_, test) =>
if (test) {
io.map { case (bb, _) => (bb, false) }
} else {
io.flatMap { case (bb, _) => next(bb) }
}
}
}
}
然后你可以做:
io
.mightJumpNext(b=> step2(b))
.mightJumpNext(b => step3(b))
...