Task\ZIO можно вставлять вместо фьючи всюду безболезненно, получая только профит
Обычно я предлагаю решения вроде
[F[_]: WontCreate[?[_], Entity]]: F[Entity]
Но учитывая количество человек, по абсурдным причинам продолжающих утверждать, что Future[Whatever] - приемлемый подход, я вынужден проигнорировать персональную мотивацию
ZIO имеет возможность обработать любой непредсказуемый Exception возникший в ходе процесса.
Вопрос остаётся только в том, какие особые ветки процесса вам необходимо обрабатывать в своей логике.
Если нет намерения посреди выполнения анализировать все возможные рантайм ошибки, нужно учесть все альтернативные (не приводящие к конструкции T) варианты выполнения логики, учесть их во втором тайп-параметре ZIO.
Если есть особенности процесса, которые стоит рассматривать как логические ошибки, и есть такие особенности, которые говорят о том, что процесс не нужно выполнять дальше, вы вольны (и ZIO благословляет на это) создать соответствующую иерархию
sealed trait CreationExit
sealed trait CreationError extends CreationExit
.....
final case class WontCreate(reason: Reason) extends CreationExit
Это позволит использовать тип ZIO[Any, CreationExit, A] в котором легко использовать код, который будет работать с логикой, потенциально продуцирующей
CreationError
И код, который сгенерирует в итоге WontCreate, т.к.
оба ZIO[R, CreationError, A] и ZIO[R, WontCreate, A] являются подтипами необходимого результата и все базовые комбинаторы учитывают этот факт.
ZIO можно использовать совместно с ApplicativeAsk?
Обсуждают сегодня