Правильный способ преобразования очереди, выдающей Take[_, A] в A?
Я не совсем понимаю дизайн пользовательского уровня ZStream ZIO при записи в очередь:
val queue: RIO[Scope, Dequeue[Take[Nothing, Int]]] =
ZStream(1, 2).toQueue()
... излучающий (например)Take(Success(Chunk(1)))
Я понимаю, что на низком уровне что-то подобное необходимо как способ выражения завершений и ошибок в виде типов данных. Но это кажется немного громоздким на уровне пользователя. Есть ли способ развернуть их в простые элементы?
Это выглядит какTake#done
может быть частью головоломки:
def done[R](implicit trace: Trace): ZIO[R, Option[E], Chunk[A]] =
ZIO.done(exit)
Но у меня такое ощущение, что где-то наверняка завалялась какая-то утилита, которую я вижу, которая умеет разворачивать полученноеOption[E]
вE
иChunk[A]
так что каждая операция потребления результата может иметь дело только с однимA
.
1 ответ
После небольшого исследования и экспериментирования я кое-что узнал. Возможно, они не оптимальны (оставим это открытым на некоторое время, чтобы посмотреть, добавят ли другие полезные ответы), но на данный момент они кажутся нормальными.
Одним из решений является использованиеZStream#toQueueOfElements()
, что вместо этого даетDequeue[Exit[Option[Nothing], A]]
. Это не совсем похоже на возможность сделать.await
наDequeue[A]
, но это немного лучше - для элемента (a) вы можете сделать:
a match {
case Exit.Success(value) => ???
case Exit.Failure(cause) => ???
}