Skip to content

Instantly share code, notes, and snippets.

@pnf
Created June 26, 2017 18:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pnf/8d9fa9b0610476d4ac1839c5ea820112 to your computer and use it in GitHub Desktop.
Save pnf/8d9fa9b0610476d4ac1839c5ea820112 to your computer and use it in GitHub Desktop.
trait ViewTransformer[-A,+B] {
def sequence(in: Iterable[A]) = transform(in.view).to(IterableFactory.toSpecific(in.iterableFactory))
def transform(v: View[A]): View[B]
def map[C](f: B => C): ViewTransformer[A,C] = new ViewTransformerImpl[A,C,B](this) {
override def transform(v: View[A]): View[C] = prev.transform(v).map(f)
}
def flatMap[C](f: B => IterableOnce[C]): ViewTransformer[A,C] = new ViewTransformerImpl[A,C,B](this) {
override def transform(v: View[A]): View[C] = prev.transform(v).flatMap(f)
}
}
object ViewTransformer {
def id[A] = new ViewTransformer[A,A] {
def transform(v: View[A]) = v
}
}
abstract class ViewTransformerImpl[-A,+B,+Interm](val prev: ViewTransformer[A,Interm]) extends ViewTransformer[A,B]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment