iteratees/enumerators in play

Post on 21-Dec-2014

226 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Slides for the talk at the Play Meetup Hamburg about Enumerators, Iteratees and Enumeratees.

TRANSCRIPT

|>>>ITERATEE

ENUMERATOR &> PLAY

MARKUS.KLINK@INO.IO@JOHEINZ

PLAY MEETUP HAMBURG, 6.10.2014

GIT CLONE HTTPS://GITHUB.COM/INOIO/ITERATEE-TALK !

!

!

SBT ~RUN

3

SOME LINKS:PLAY DOCUMENTATION (MORE OR LESS INCOMPREHENSIBLE) HTTP://MANDUBIAN.COM/2012/08/27/UNDERSTANDING-PLAY2-ITERATEES-FOR-NORMAL-HUMANS/(ADDRESSES SOME OF THE SHORTCOMINGS) HTTPS://JAZZY.ID.AU/2012/11/06/ITERATEES_FOR_IMPERATIVE_PROGRAMMERS.HTML(YEAH, MORE INFO) ACTIVATOR TEMPLATE (SEARCH FOR ITERATEES) HTTPS://GITHUB.COM/JROPER/PLAY-ITERATEES-EXTRAS HTTPS://WWW.PLAYFRAMEWORK.COM/DOCUMENTATION/2.3.X/API/SCALA/INDEX.HTML#PLAY.API.LIBS.ITERATEE.PACKAGE

DATA PROCESSINGPIPELINE

HARPER & CHRISTY DOING IT PURELY FUNCTIONAL

„REACTIVE STREAMS ARE TWO WAY, IT'S NOT JUST YOU, THE STREAM CONSUMER THAT IS REACTING TO INPUT, THE STREAM PRODUCER MUST REACT TO YOU BEING READY FOR INPUT.“ James Roper

OTHER IMPLEMENTATIONS SCALAZ STREAM SCALAZ ITERATEES (OUTDATED)

THE IMPORTANT BITSENUMERATOR[A]

PRODUCES VALUES OF TYPE A MONAD (COMPOSABLE WITH A CONTEXT) MANY UTILITIES IN COMPANION OBJECT SMART !

ENUMERATOR APIEnumerator.apply[A](a: A*) : Enumerator[A] Enumerator.enumerate[A](a: TraversableOnce[A]) : Enumerator[A] Enumerator.generateM[A](e : => Future[Option[A]]) : Enumerator[A]

ALL THE FLATMAP GOODIES + GIVEN AN ENUMERATOR[E]

|>>[A](i: Iteratee[E, A]): Future[Iteratee[E, A]] |>>>[A](i: Iteratee[E, A]): Future[A] &>[To](enumeratee: Enumeratee[E, To]): Enumerator[To]

THE IMPORTANT BITSENUMERATEE[A,B]

TRANSFORMS VALUES FROM A => B !

MANY UTILITIES IN COMPANION OBJECT !

NOT AS DUMP AS I THOUGHT

THE IMPORTANT BITSITERATEE[A,B]

CONSUMES INPUT ELEMENTS OF TYPE A AND OUTPUTS B MONAD (COMPOSABLE WITH A CONTEXT) SUPER SMART !

!

!

INPUT IS EITHER: A.EMPTY: INPUT.EMPTY B.EOF: INPUT.EOF C.OR CONTAINS AN A: INPUT.EL(A) !

ITERATEE STATE IS EITHER: A. DONE CONSUMING WITH A RESULT B. READY TO CONSUME MORE CONT C. OR IN ERROR STATE

ITERATEE APIALL THE FLATMAP GOODIES + GIVEN AN ITERATEE[E,A]

run: Future[A]

COMMON PATTERN TO BUILD AN ITERATEE:

def myIteratee(x: AllTheStateINeed, oForNothing: O) : Iterator[I,O] = Cont { case Input.EOF => Done(oForNothing, Input.EOF) case Input.Empty => myIterator(x, oForNothing) case in@Input(i) => // be done with o || change state and recurse // create an Error with Error(„message“, in)

!

HINTWHEN USING DONE, ALWAYS SPECIFY THE NEXT INPUT EXPLICITLY (DEFAULTS TO INPUT.EMPTY)

ENUMERATOR ITERATEEENUMERATEE

&>>&>

ENUMERATOR ITERATEE

ENUMERATEE API

ENUMERATEE><>

ENUMERATEE APITHINK OF AN ENUMERATOR AS A KIND OF TRANSFORMER, ADAPTER AND COLLECTION:

TAKE, TAKEWHILE, GROUPED, DROP, DROPWHILE, FILTER, FILTERNOT, MAP, …

COMPOSE ITERATEES & ENUMERATORS

USING FOR COMPREHENSIONS

val processElement: Iteratee[Byte, Element] = for { _ <- findLeftBrace string <- consumeUntilRightBrace element <- { safeParse(string) match { case Success(element) => Done[Byte, Element](element) case Failure(_) => Error[Byte](s"$string not a valid element", Input.EOF) } } } yield element

CODEIN PRINCIPLE IT’S EASY,

IT IS JUST POWERFUL

top related