Se ho un EnumeratorT
e un corrispondente IterateeT
posso 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 up
o, più in generale, Hoist
per "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 Hoist
un'istanza EnumeratorT
né 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 A
per fornire Task[A]
.
Enumerator
è davvero solo un involucro attorno a unStepT => IterateeT
, il che suggerisce che dovrai "dimettermi" da aStepT[E, BigMonad, A]
.