Example code and slides originating from a talk I gave at ScalaMUC on 2013-12-17.
The code has been split into two separate packages, pure
and wrapped
, which
mainly differ in the implementation of the apply
and run
methods of both
enumerators and iteratees. Worksheets with usage examples are contained in the
worksheets
folder.
Getting a grip on the basics of iteratees is supposedly easier by first looking
at the "pure" implementation. Note that the "wrapped" implementation simply
wraps the computations into the "monad-of-the-day" (aside from the fact
that I've used Try
for demonstration purposes which actually isn't a
monad). Other frameworks implement this in a similar manner.
So far, enumeratees have only been implemented in the pure
package (as a
deliberate choice). Enumeratees effectively act as monad transformers where the
type of the monad is fixed to Iteratee
(which is also why the respective
code is a little more advanced). Note that the corresponding methods may call
the step functions of the transformed iteratees which means that exceptions
cannot be avoided by simply wrapping enumeratees like it was done with the
iteratees in the wrapped
package.
Functional programming enthusiasts might want to check out
scalaz's implementation. The latter is
based on monad transformers and thus way more general once it comes to IO
,
Future
and friends.