Each, a maco library that creates monadic expression, released

79 views
Skip to first unread message

杨博

unread,
Jul 14, 2015, 8:47:09 AM7/14/15
to scala...@googlegroups.com, scala-l...@googlegroups.com, sca...@googlegroups.com
Hello, all,

I am glad to announce Each, a new library that converts native imperative syntax to scalaz's monadic expression.

Each allows you create monadic expression in a pretty simple way.

import com.thoughtworks.each.Monadic._
import scalaz.std.scalaFuture._

// Returns a Future of the sum of the length of each string in each parameter Future,
// without blocking any thread.
def concat(future1: Future[String], future2: Future[String]): Future[Int] = monadic[Future] {
  future1.each.length + future2.each.length
}

import com.thoughtworks.each.Monadic._
import scalaz.std.option._

def plusOne(intOption: Option[Int]) = monadic[Option] {
  intOption.each + 1
}
assertEquals(None, plusOne(None))
assertEquals(Some(16), plusOne(Some(15)))

import com.thoughtworks.each.Monadic._
import scalaz.std.list._

def plusOne(intSeq: List[Int]) = monadic[List] {
  intSeq.each + 1
}
assertEquals(Nil, plusOne(Nil))
assertEquals(List(16), plusOne(List(15)))
assertEquals(List(16, -1, 10), plusOne(List(15, -2, 9))
We also provided a generic monad implementation for all types that support for comprehension. The ComprehensionImplicits is able to implicitly create Seq monad, Set monad, Vector monad, etc.
import com.thoughtworks.each.ComprehensionImplicits._
import com.thoughtworks.each.Monadic._
def plusOne(intSeq: Seq[Int]) = monadic[Seq] {
  intSeq.each + 1
}
assertEquals(Seq.empty, plusOne(Seq.empty))
assertEquals(Seq(16), plusOne(Seq(15)))
assertEquals(Seq(16, -1, 10), plusOne(Seq(15, -2, 9)))

Each is like Effectful, except we support fully-featured Scala expressions in our monadic block, while Effectful only supports a subset of Scala expressions.


Thanks to all contributors in ThoughtWorks Xi'an office.
Cheers,
--
杨博 (Yang Bo)
Reply all
Reply to author
Forward
0 new messages