MapMonoid
import scalaz._
import Scalaz._
val myMap:Map[Int, Seq[String]] = Map(1->Seq("1","12"),2->Seq("3","4"),3->Seq("6","7"))
val myMap1:Map[Int, Seq[String]] = Map(1->Seq("5","6"),2->Seq("7","8"))
//myMap |+| myMap1
implicit val mapMonoid = new Monoid[Map[Int, Seq[String]]] {
override def zero: Map[Int, Seq[String]] = Map.empty
override def append(f1: Map[Int, Seq[String]], f2: => Map[Int, Seq[String]]): Map[Int, Seq[String]] = {
f1.foldLeft(f2) {
//entry comes from first map.
//Acc second map
case (acc, entry) => {
if(acc.contains(entry._1)) {
val p = acc.get(entry._1).get ++ entry._2
acc + (entry._1 -> p)
}else{
acc + entry
}
}
}
}
}
myMap |+| myMap1
More generic is here: Need to test it out. https://gist.github.com/nuttycom/1015485