Scalaz:绕过 IO 管道?

Scalaz: Bypass IO pipeline?

我不知道该怎么做,我想做的是:

 output1 <- step1(...)
 output2 <- step2(....)
 ....

我想做的是针对特定的 output1,我不想执行 step2 而只是通过它。 scalaz.zio.IO有内置函数部分吗?

除了嵌套 flatMap 之外我找不到任何东西:

 step1(...).flatMap {
      case ... => step2(....)
      case ... => step3(...)
 }

但是当 step2 也产生一个条件时,这就变得很难看了,等等...

我也可以使用 IOLeft 部分,但我已经将其用于 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))
    ...