Se eu tiver um EnumeratorT
e um correspondente IterateeT
, posso executá-los juntos:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Se a mônada do enumerador for "maior" que a mônada do iterado, eu posso usar up
ou, de maneira mais geral, Hoist
"elevar" o iterado para corresponder:
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]
Mas o que faço quando a mônada iterada é "maior" que a mônada do enumerador?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Parece não haver um Hoist
exemplo EnumeratorT
nem método óbvio de "levantamento".
Enumerator
é apenas uma fonte eficaz, certo? Parece que eu deveria poder usar algo que possa fornecer A
para suprir Task[A]
.
Enumerator
é realmente apenas um invólucro em torno de umStepT => IterateeT
, o que sugere que você precisará "renunciar" de umStepT[E, BigMonad, A]
.