Скалаз: Обойти IO трубопровод? - PullRequest
0 голосов
/ 23 декабря 2018

Я не уверен, как это сделать, то, что я пытаюсь сделать, это:

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

Что я пытаюсь сделать, это для конкретного output1, я бы не хотел выполнять step2 и просто пройти через это.Есть ли встроенная функциональная часть scalaz.zio.IO?

Я не могу найти ничего кроме вложенного flatMap:

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

Но это становится уродливым, когда step2 также приводит к условию и т. Д. *

Я мог бы также использовать Left часть IO, но я уже использую ее для Exception и отслеживания ошибок.

Будет ли IO[Error, IO[ByPassCondition, ResultForStep2]] работать?Но тогда я не могу передать ResultForStep2 до step2, если установлено ByPassCondition ...

1 Ответ

0 голосов
/ 23 декабря 2018

Я нашел решение:

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))
    ...
...