2013-06-03 20 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/main/scala/scalaz/stream/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 } 
    } 
} 
関連する問題