aboutsummaryrefslogtreecommitdiff
path: root/core/lib/FiberConversions.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/lib/FiberConversions.scala')
-rw-r--r--core/lib/FiberConversions.scala46
1 files changed, 46 insertions, 0 deletions
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
+ }
+ }
+ }
+}