from the desk of brilliant paula bean
Aug. 6th, 2016 09:45 amimplicit class StreamOfResults[T](source: Stream[Result[T]]) { def |>[U](op: T ⇒ Result[U]) = source map (t ⇒ t flatMap op) def filter(p: T ⇒ Outcome) = source |> (x => p(x) andThen Good(x)) def map[U](f: T ⇒ U) = source map (_ map f) }
implicit class StreamOfResults[T](source: Stream[Result[T]]) { def |>[U](op: T ⇒ Result[U]) = source map (t ⇒ t flatMap op) def filter(p: T ⇒ Result[_]) = source |> (x ⇒ p(x) returning x) def map[U](f: T ⇒ U) = source map (_ map f) }
E.g. use case:
// this method could be written in a couple of lines, but it's better to keep the details def streamOfNewEobSelectors(): StreamOfResults[Element] = { // this function pairs an html element with its content def withContent(e: Element): Result[(Element, String)] = e.outerHtml() map ((e, _)) // here we have a stream of elements paired with their content val pairs: StreamOfResults[(Element, String)] = streamOfEobElements |> withContent // here we filter the stream, leaving only the elements containing new stuff // note that the stuff we don't need is not kicked out, it's labeled as bad with an explanation val newOnes: StreamOfResults[(Element, String)]] = pairs filter (p => isNewClaim(p._2)) // here we forget the html newOnes map {case p:(Element, String) => p._1} }
Note that
filter
does not take a boolean
, it takes an Outcome
, which is a logical value, from the logic that I'm trying to work on. It's not Boolean.