2013-06-03 134 views
6

是否有人碰到过这段代码来实现枚举的条件组合?从本质上给我有条件地枚举枚举

val decideEnumeratee : Enumerate[A,Either[L,R] = Enumerate.map(a=>???) 
val leftSideEnumeratee : Enumeratee[L,B] = Enumeratee.map(l=>???) 
val rightEnumeratee: Enumeratee[R,B] = Enumeratee.map(r=>???) 

我想有执行下列组合子的:

def either[L,R,B](left:Enumeratee[L,B], right,Enumeratee[R,B]): Enumeratee[Either[L,R],B] = ??? 

有没有人遇到过类似的enumeratee实施?

+1

你的意思是这样的星形或scalaz流两个函数(https://github.com/scalaz/scalaz-stream/blob/master/的src /主/阶/ scalaz /流/ Process.scala)? –

+0

是的。但是看起来Enumeratee是不行的,相应的,如果你在组合的Enumeratees中保持任何处理状态,你就无法做到这一点。 –

回答

0

这里是either一个定义:

def either[A, B, C](left: Enumeratee[A, C], right: Enumeratee[B, C]) 
    (implicit ec: ExecutionContext) = new Enumeratee[Either[A, B], C] { 
    def applyOn[IR](inner: Iteratee[C, IR]) = { 
     val (liter, lenum) = Concurrent.joined[C] 
     val (riter, renum) = Concurrent.joined[C] 
     val liter2 = Enumeratee.mapConcat { x: Either[A, B] => 
      x.left.toSeq 
     } compose left transform liter 
     val riter2 = Enumeratee.mapConcat { x: Either[A, B] => 
      x.right.toSeq 
     } compose right transform riter 
     val fresult = lenum interleave renum apply inner 
     Enumeratee.zip(liter2, riter2) mapM { _ => fresult } 
    } 
}