2

I have:

val having: Option[String] = ... val averageStream = having match { case Some(expr) => stream[TimeMovingAverage].filter("name = '#name'").where(expr) case None => stream[TimeMovingAverage].filter("name = '#name'") } 

Is there some scalaz magic that would eliminate the duplication?

I could do something like

val averageStream1 = stream[TimeMovingAverage].filter("name = '#name'") val averageStream2 = having.map(averageStream1.where(_)) 

But that seems a bit awkward. I guess I am looking for something like

val averageStream = stream[TimeMovingAverage].filter("name = '#name'") |?| having.cata(_.where(_), _) // Clearly some ambiguities with the _'s here 

1 Answer 1

2
stream[TimeMovingAverage].filter("name = '#name'") |> { str => having.cata(str.where(_), str) } 

or even

stream[TimeMovingAverage].filter("name = '#name'") |> ( having.cata(expr => _.where(expr), identity) : T => T ) 

T => T must be changed to the type of stream[TimeMovingAverage] which makes it less practical unless you find the following specialisation of |> in scalaz or define it yourself:

implicit def WrapIt[T](t: T) = new { def |~> (arg: T => T) = arg(t) def |?> (arg: Option[T => T]): T = arg.getOrElse(identity (_:T)).apply(t) } stream[TimeMovingAverage].filter("name = '#name'") |~> having.cata(expr => _.where(expr), identity) stream[TimeMovingAverage].filter("name = '#name'") |?> having.map(expr => _.where(expr)) 

Not sure, if one should really come up with something like this, though.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.