iniyanp
6/10/2017 - 12:46 AM

MapMonoid

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