16
|>>> ITERATEE ENUMERATOR &> PLAY [email protected] @JOHEINZ PLAY MEETUP HAMBURG, 6.10.2014

Iteratees/Enumerators in Play

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Iteratees/Enumerators in Play

|>>>ITERATEE

ENUMERATOR &> PLAY

[email protected]@JOHEINZ

PLAY MEETUP HAMBURG, 6.10.2014

Page 2: Iteratees/Enumerators in Play

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

!

!

SBT ~RUN

Page 3: Iteratees/Enumerators in Play

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

Page 4: Iteratees/Enumerators in Play

DATA PROCESSINGPIPELINE

HARPER & CHRISTY DOING IT PURELY FUNCTIONAL

Page 5: Iteratees/Enumerators in Play

„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

Page 6: Iteratees/Enumerators in Play

OTHER IMPLEMENTATIONS SCALAZ STREAM SCALAZ ITERATEES (OUTDATED)

Page 7: Iteratees/Enumerators in Play

THE IMPORTANT BITSENUMERATOR[A]

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

Page 8: Iteratees/Enumerators in Play

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]

Page 9: Iteratees/Enumerators in Play

THE IMPORTANT BITSENUMERATEE[A,B]

TRANSFORMS VALUES FROM A => B !

MANY UTILITIES IN COMPANION OBJECT !

NOT AS DUMP AS I THOUGHT

Page 10: Iteratees/Enumerators in Play

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

Page 11: Iteratees/Enumerators in Play

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)

!

Page 12: Iteratees/Enumerators in Play

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

Page 13: Iteratees/Enumerators in Play

ENUMERATOR ITERATEEENUMERATEE

&>>&>

ENUMERATOR ITERATEE

ENUMERATEE API

ENUMERATEE><>

Page 14: Iteratees/Enumerators in Play

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

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

Page 15: Iteratees/Enumerators in Play

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

Page 16: Iteratees/Enumerators in Play

CODEIN PRINCIPLE IT’S EASY,

IT IS JUST POWERFUL