Jika saya punya EnumeratorT
dan yang sesuai IterateeT
saya bisa menjalankannya bersama-sama:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Jika enumerator monad "lebih besar" dari iteratee monad, saya dapat menggunakan up
atau, secara umum, Hoist
untuk "mengangkat" iteratee agar sesuai:
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]
Tetapi apa yang harus saya lakukan ketika iteratee monad "lebih besar" daripada enumerator monad?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Tampaknya tidak ada Hoist
contoh untuk EnumeratorT
, atau metode "lift" yang jelas.
Enumerator
itu hanya sumber yang efektif, bukan? Rasanya seperti saya harus dapat menggunakan sesuatu yang dapat memasok A
untuk memasok Task[A]
.
Enumerator
benar-benar hanya pembungkus di sekitar aStepT => IterateeT
, yang menunjukkan bahwa Anda harus "mundur" dari aStepT[E, BigMonad, A]
.