+ All Categories
Home > Documents > Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama...

Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama...

Date post: 22-Jul-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
93
Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia
Transcript
Page 1: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Scalaz-Stream Masterclass

Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia

Page 2: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Scalaz-Stream (FS2)

Functional Streams for Scala https://github.com/functional-streams-for-scala/fs2

Page 3: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Disclaimer

This library is changing. We’ll talk about the current version (0.8).Scalaz 7.1

Page 4: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Scalaz-Stream (FS2)

a purely functional streaming I/O library for Scala

Page 5: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

• Streams are essentially “lazy lists” of data and effects.

• Naturally pull-based

• Immutable andreferentially transparent

Page 6: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Design goals

• compositional

• expressive

• resource-safe

• comprehensible

Page 7: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Takeaway: No magic

Page 8: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

import scalaz.stream._ import scalaz.concurrent.Task

val converter: Task[Unit] = io.linesR("testdata/fahrenheit.txt") .filter(s => !s.trim.isEmpty && !s.startsWith("//")) .map(line => fahrenheitToCelsius(line.toDouble).toString) .intersperse("\n") .pipe(text.utf8Encode) .to(io.fileChunkW("testdata/celsius.txt")) .run

val u: Unit = converter.run

Page 9: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.concurrent.Task

• Asynchronous

• Compositional

• Purely functional

Page 10: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a Task is a first-class program

Page 11: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a Task is a list of instructions

Page 12: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Task is a monad

Page 13: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a Task doesn’t do anything until you call .run

Page 14: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Constructing Tasks

Page 15: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Task.delay(readLine): Task[String]

Task.now(42): Task[Int]

Task.fail( new Exception("oops!") ): Task[Nothing]

Page 16: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

fut: scala.concurrent.Future[Int]

Task.async(fut.onComplete): Task[Int]

Page 17: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Task.async { k => fut.onComplete { case Success(a) => k(\/.right(a)) case Fail(a) => k(\/.left(e)) } }

Page 18: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a: Task[A] pool: java.util.concurrent.ExecutorService

Task.fork(a)(pool): Task[A]

Page 19: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Combining Tasks

Page 20: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a: Task[A] b: Task[B]

val c: Task[(A,B)] = Nondeterminism[Task].both(a,b)

Page 21: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a: Task[A] f: A => Task[B]

val b: Task[B] = a flatMap f

Page 22: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val program: Task[Unit] = for { _ <- delay(println("What's your name?")) n <- delay(scala.io.StdIn.readLine) _ <- delay(println(s"Hello $n")) } yield ()

Page 23: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Running Tasks

Page 24: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a: Task[A]

a.run: A

Page 25: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

a: Task[A] k: (Throwable \/ A) => Unit

a runAsync k: Unit

Page 26: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Handling errors

Page 27: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Task.delay { throw new Exception("oops") }

Task.fail { new Exception("oops") }

Page 28: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

t: Task[A]

t.attempt: Task[Throwable \/ A]

Page 29: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.stream.Process

Page 30: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Process[+F[_],+A]

Page 31: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Process[Task,A]

Page 32: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val halt: Process[Nothing,Nothing]

def emit[O](o: O): Process[Nothing,O]

def await[F[_],I,O]( req: F[I])( recv: I => Process[F,O]): Process[F,O]

Stream primitives

Page 33: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

foo: F[A]

Process.eval(foo): Process[F,A]

Page 34: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

foo: F[A]

await(foo)(emit): Process[F,A]

Page 35: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Process.eval( Task.delay(readLine) ): Process[Task,String]

Page 36: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

def IO[A](a: => A): Process[Task,A] = Process.eval(Task.delay(a))

Page 37: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Combining Processes

Page 38: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

p1: Process[F,A] p2: Process[F,A]

val p3: Process[F,A] = p1 ++ p2

Page 39: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

p1: Process[F,A] p2: Process[F,A]

val p3: Process[F,A] = p1 append p2

Page 40: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val twoLines: Process[Task,String] = IO(readLine) ++ IO(readLine)

Page 41: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val stdIn: Process[Task,String] = IO(readLine) ++ stdIn

Page 42: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val stdIn: Process[Task,String] = IO(readLine).repeat

Page 43: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val cat: Process[Task,Unit] = stdIn flatMap { s => IO(println(s)) }

Page 44: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val cat: Process[Task,Unit] = for { s <- stdIn _ <- IO(println(s)) } yield ()

Page 45: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

def grep(r: Regex): Process[Task,Unit] = { val p = r.pattern.asPredicate.test _ def out(s: String) = IO(println(s))

stdIn filter p flatMap out }

Page 46: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Running Processes

Page 47: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

F: Monad

p: Process[F,A]

p.run: F[Unit]

Page 48: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

p: Process[F,A]

p.runLog: F[List[A]]

Page 49: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

p: Process[F,A]

B: Monoid

f: A => B

p runFoldMap f: F[B]

Page 50: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Pipes

Page 51: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Process.await1[A]: Process1[A,A]

Page 52: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

def take[I](n: Int): Process1[I,I] = if (n <= 0) halt else await1[I] ++ take(n - 1)

Page 53: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

as: Process[F,A]

p: Process1[A,B]

as pipe p: Process[F,B]

Page 54: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

as: Process[F,A]

val p = process1.chunk(10)

as pipe p: Process[F,Vector[A]]

Page 55: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

as: Process[F,A]

as.chunk(10): Process[F,Vector[A]]

Page 56: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

def distinct[A]: Process1[A,A] = { def go(seen: Set[A]): Process1[A,A] = Process.await1[A].flatMap { a => if (seen(a)) go(seen) else Process.emit(a) ++ go(seen + a) } go(Set.empty) }

Page 57: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Process1[A,B] ~= Process[(A=>?),O]

Page 58: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Multiple sources

Page 59: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.stream.tee

Page 60: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val f1 = scalaz.stream.io.linesR("/tmp/foo.txt") val f2 = scalaz.stream.io.linesR("/tmp/bar.txt")

type Source[A] = Process[Task,A]

f1 zip f2: Source[(String,String)] f1 interleave f2: Source[String] f1 until f2.map(_ == "stop"): Source[String]

Page 61: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

f1 zip f2 f1 interleave f2 f1 until f2.map(_ == "stop")

Page 62: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

f1.tee(f2)(tee.zip) f1.tee(f2)(tee.interleave) f1.map(_ == "stop").tee(f2)(tee.until)

Page 63: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

as: Process[F,A] bs: Process[F,B] t: Tee[A,B,C]

(as tee bs)(t): Process[F,C]

Page 64: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val add: Tee[Int,Int,Int] = { for { x <- awaitL[Int] y <- awaitR[Int] } yield x + y }.repeat

val sumEach = (p1 tee p2)(add)

Page 65: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Tee[A,B,O] ~=

Process[λ[x] = (A=>x) \/ (B=>x), O]

Page 66: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.stream.wye

Page 67: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val f1 = IO(System.in.read).repeat val f2 = io.linesR("/tmp/foo.txt")

type Source[A] = Process[Task,A]

f1 either f2: Source[Int \/ String] f1.map(_.toChar.toString) merge f2: Source[String]

f1.map(_ => true))(f2)(wye.interrupt): Source[String]

Page 68: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

as: Process[F,A] bs: Process[F,B] y: Wye[A,B,C]

(as wye bs)(y): Process[F,C]

Page 69: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Wye[A,B,O] ~=

Process[λ[x] = (A=>x, B=>x, (A,B)=>x), O]

Page 70: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.stream.merge

Page 71: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

ps: Process[F,Process[F,A]]

merge.mergeN(ps): Process[F,A]

Page 72: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

nondeterminism.njoin(maxOpen, maxQueued)(ps)

Page 73: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Sinks

Page 74: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

x : Process[F,A] y : Sink[F,A]

x to y : Process[F,Unit]

Page 75: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

import scalaz.stream.io

io.stdInLines: Process[Task,String] io.stdOutLines: Sink[Task,String]

val cat = io.stdInLines to io.stdOutLines

Page 76: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

A sink is just a stream of functions

Page 77: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

type Sink[F[_],A] = Process[F, A => Task[Unit]]

Page 78: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val stdOut: Sink[Task,String] = IO { s => Task.delay(println(s)) }.repeat

Page 79: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Channels

Page 80: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

x : Process[F,A] y : Channel[F,A,B]

x through y : Process[F,B]

Page 81: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

A channel is just a stream of functions

Page 82: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

type Channel[F[_],A,B] = Process[F, A => F[B]]

Page 83: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

type Sink[F[_],A] = Channel[F,A,Unit]

Page 84: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

s: java.io.InputStream

io.chunkR(s): Channel[Task,Int,ByteVector]

Page 85: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

scalaz.stream.async

Page 86: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Queues & Signals

Page 87: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

trait Queue[A] { ... def enqueue: Sink[Task,A] def dequeue: Process[Task,A] ... }

Page 88: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

import scalaz.stream.async._

def boundedQueue[A](n: Int): Queue[A]

def unboundedQueue[A]: Queue[A]

def circularBuffer[A](n: Int): Queue[A]

Page 89: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

val pool = java.util.concurrent.Executors.newFixedThreadPool(16)

implicit val S = scalaz.concurrent.Strategy.Executor(pool)

Page 90: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

trait Signal[A] { ... def get: Task[A] def set(a: A) Task[Unit] ... }

Page 91: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

trait Signal[A] { ... def discrete: Process[Task,A] def continuous: Process[Task,A] ... }

Page 92: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

Demo: Internet Relay Chat

Page 93: Scalaz-Stream Masterclass · Scalaz-Stream Masterclass Rúnar Bjarnason, Verizon Labs @runarorama NEScala 2016, Philadelphia. Scalaz-Stream (FS2) ... Scalaz 7.1. Scalaz-Stream (FS2)

https://github.com/runarorama/ircz


Recommended