Se ho un EnumeratorTe un corrispondente IterateeTposso eseguirli insieme:
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 la monade dell'enumeratore è "più grande" della monade iterata, posso usare upo, più in generale, Hoistper "sollevare" l'iterata affinché corrisponda:
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]
Ma cosa devo fare quando la monade iterata è "più grande" della monade enumeratrice?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Non sembra esserci Hoistun'istanza EnumeratorTné un metodo evidente di "sollevamento".
Enumeratorè solo una fonte efficace, giusto? Mi sento come se dovessi essere in grado di utilizzare qualcosa che può fornire Aper fornire Task[A].
Enumeratorè davvero solo un involucro attorno a unStepT => IterateeT, il che suggerisce che dovrai "dimettermi" da aStepT[E, BigMonad, A].