Si tengo un EnumeratorT
y 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 up
o, más generalmente, Hoist
para "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 Hoist
instancia EnumeratorT
ni un método obvio de "elevación".
Enumerator
es solo una fuente efectiva, ¿verdad? Parece que debería poder usar algo que puede suministrar A
para suministrar Task[A]
.
Enumerator
realidad es solo una envoltura alrededor de aStepT => IterateeT
, lo que sugiere que tendrá que "renunciar" de aStepT[E, BigMonad, A]
.