From 6b620da09b9f05699c1cf6080de229e63de47942 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sun, 7 Jan 2018 21:51:22 +0100 Subject: Add initial code and project files. --- core/lib/FiberConversions.scala | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 core/lib/FiberConversions.scala (limited to 'core/lib/FiberConversions.scala') diff --git a/core/lib/FiberConversions.scala b/core/lib/FiberConversions.scala new file mode 100644 index 0000000..fe79796 --- /dev/null +++ b/core/lib/FiberConversions.scala @@ -0,0 +1,46 @@ +package eu.mulk.fibers + +import scala.collection.generic.CanBuildFrom +import scala.collection.{GenTraversableOnce, IterableLike} +import scala.language.implicitConversions + +/** + * Implicit conversions for convenient use of containers from within + * fibers. + */ +private[fibers] trait FiberConversions extends FiberTypes { + // + // This is based on code by James Earl Dougles, taken from: + // + // https://earldouglas.com/posts/monadic-continuations.html + // + + /** + * Defines the `cps` helper on [[IterableLike]] objects, which you can call to + * traverse them from fibers. + */ + implicit def cpsIterable[A, Repr](xs: IterableLike[A, Repr]) = new { + + /** + * Provides fiber-compatible iteration functions. + */ + def cps = new { + def foreach[B, T](f: A => Any @fiber[T]): Unit @fiber[T] = { + val it = xs.iterator + while (it.hasNext) f(it.next) + } + def map[B, That, T](f: A => B @fiber[T])( + implicit cbf: CanBuildFrom[Repr, B, That]): That @fiber[T] = { + val b = cbf(xs.repr) + foreach(b += f(_)) + b.result + } + def flatMap[B, That, T](f: A => GenTraversableOnce[B] @fiber[T])( + implicit cbf: CanBuildFrom[Repr, B, That]): That @fiber[T] = { + val b = cbf(xs.repr) + for (x <- this) b ++= f(x) + b.result + } + } + } +} -- cgit v1.2.3