Scalaz:绕过 IO 管道?
Scalaz: Bypass IO pipeline?
我不知道该怎么做,我想做的是:
output1 <- step1(...)
output2 <- step2(....)
....
我想做的是针对特定的 output1
,我不想执行 step2
而只是通过它。 scalaz.zio.IO
有内置函数部分吗?
除了嵌套 flatMap
之外我找不到任何东西:
step1(...).flatMap {
case ... => step2(....)
case ... => step3(...)
}
但是当 step2
也产生一个条件时,这就变得很难看了,等等...
我也可以使用 IO
的 Left
部分,但我已经将其用于 Exception
和错误跟踪。
IO[Error, IO[ByPassCondition, ResultForStep2]]
行吗?但是如果设置了 ByPassCondition
,我就无法将 ResultForStep2
传递给 step2
...
我找到了解决方案:
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))
...
我不知道该怎么做,我想做的是:
output1 <- step1(...)
output2 <- step2(....)
....
我想做的是针对特定的 output1
,我不想执行 step2
而只是通过它。 scalaz.zio.IO
有内置函数部分吗?
除了嵌套 flatMap
之外我找不到任何东西:
step1(...).flatMap {
case ... => step2(....)
case ... => step3(...)
}
但是当 step2
也产生一个条件时,这就变得很难看了,等等...
我也可以使用 IO
的 Left
部分,但我已经将其用于 Exception
和错误跟踪。
IO[Error, IO[ByPassCondition, ResultForStep2]]
行吗?但是如果设置了 ByPassCondition
,我就无法将 ResultForStep2
传递给 step2
...
我找到了解决方案:
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))
...