Wenn ich einen EnumeratorT
und einen entsprechenden IterateeT
habe, kann ich sie gemeinsam ausführen:
val en: EnumeratorT[String, Task] = EnumeratorT.enumList(List("a", "b", "c"))
val it: IterateeT[String, Task, Int] = IterateeT.length
(it &= en).run : Task[Int]
Wenn der Enumerator-Monad "größer" ist als der Iteratee-Monad, kann ich up
oder allgemeiner Hoist
verwenden, um den Iteratee anzugleichen:
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]
Aber was mache ich, wenn der Iteratee-Monad "größer" ist als der Enumerator-Monad?
val en: EnumeratorT[String, Id] = ...
val it: IterateeT[String, Task, Int] = ...
it &= ???
Es scheint keinen Hoist
-Instanz für EnumeratorT
zu geben, noch eine offensichtliche "Anhebungs"-Methode.