Si tengo un EnumeratorTy un correspondiente IterateeT, puedo ejecutarlos 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]
Si la mónada enumeradora es "más grande" que la mónada iterada, puedo usar upo, más generalmente, Hoistpara "levantar" la iteración para que coincida:
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]
Pero, ¿qué hago cuando la mónada iteratee es "más grande" que la mónada enumeradora?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
No parece haber una Hoistinstancia EnumeratorTni un método obvio de "elevación".
Enumeratores solo una fuente efectiva, ¿verdad? Parece que debería poder usar algo que puede suministrar Apara suministrar Task[A].
Enumeratorrealidad es solo una envoltura alrededor de aStepT => IterateeT, lo que sugiere que tendrá que "renunciar" de aStepT[E, BigMonad, A].