`doto` for Scala

scala

Solution

I don't think there is such a thing built-in in the library but you can mimic it quite easily:

def doto[A](target: A)(calls: (A => A)*) =
  calls.foldLeft(target) {case (res, f) => f(res)}

Usage:

scala> doto(Map.empty[String, Int])(_ + ("a" -> 1), _ + ("b" ->2))
res0: Map[String,Int] = Map(a -> 1, b -> 2)

scala> doto(Map.empty[String, Int])(List(_ + ("a" -> 1), _ - "a", _ + ("b" -> 2)))
res10: Map[String,Int] = Map(b -> 2)

Of course, it works as long as your function returns the proper type. In your case, if the function has only side effects (which is not so "scalaish"), you can change `doto` and use `foreach` instead of `foldLeft`:

def doto[A](target: A)(calls: (A => Unit)*) =
  calls foreach {_(target)}

Usage:

scala> import collection.mutable.{Map => M}
import collection.mutable.{Map=>M}

scala> val x = M.empty[String, Int]
x: scala.collection.mutable.Map[String,Int] = Map()

scala> doto(x)(_ += ("a" -> 1), _ += ("a" -> 2))

scala> x
res16: scala.collection.mutable.Map[String,Int] = Map(a -> 2)

Problem

Clojure offers a macro called `doto` that takes its argument and a list of functions and essentially calls each function, prepending the (evaluated) argument: ``` (doto (new java.util.HashMap) (.put "a" 1) (.put "b" 2)) -> {a=1, b=2} ``` Is there some way to implement something similar in Scala? I envision something with the following form: ``` val something = doto(Something.getInstance) { x() y() z() } ``` which will be equivalent to ``` val something = Something.getInstance something.x() something.y() something.z() ``` Might it be possible using `scala.util.DynamicVariable`s? Note that with factory methods, like `Something.getInstance`, it is not possible to use the common Scala pattern ``` val something = new Something { x() y() z() } ```

Original source