Nếu tôi có một EnumeratorT
và tương ứng, IterateeT
tôi có thể chạy chúng cùng nhau:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Nếu đơn vị liệt kê "lớn hơn" đơn vị iteratee, tôi có thể sử dụng up
hoặc nói chung hơn là Hoist
"nâng" iteratee để khớp:
val en: EnumeratorT[String, Task] = ...
val it: IterateeT[String, Id, Int] = ...
val liftedIt = IterateeT.IterateeTMonadTrans[String].hoist(
implicitly[Task |>=| Id]).apply(it)
(liftedIt &= en).run: Task[Int]
Nhưng tôi phải làm gì khi đơn vị iteratee "lớn" hơn đơn vị liệt kê?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Dường như không có một Hoist
ví dụ nào EnumeratorT
, cũng không có bất kỳ phương pháp "nâng" rõ ràng nào.
Enumerator
thì chỉ là một nguồn hiệu quả, phải không? Cảm giác như tôi có thể sử dụng một thứ có thể cung cấp A
để cung cấp Task[A]
.
Enumerator
thực sự chỉ là một trình bao bọc xung quanh aStepT => IterateeT
, điều đó cho thấy bạn sẽ cần phải "từ chức" từ aStepT[E, BigMonad, A]
.