Skip to content

Instantly share code, notes, and snippets.

@MasseGuillaume
Created March 25, 2015 18:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MasseGuillaume/d5a944aeb1b0da08b0f1 to your computer and use it in GitHub Desktop.
Save MasseGuillaume/d5a944aeb1b0da08b0f1 to your computer and use it in GitHub Desktop.
import scalaz.Monoid
import scala.language.higherKinds
import scalaz.syntax.monoid._
import scalaz.std.set._
implicit def mm[K, T, M[_]](implicit mo: Monoid[M[T]]): Monoid[Map[K, M[T]]] = new Monoid[Map[K, M[T]]] {
def zero = Map.empty
def append(m1: Map[K, M[T]], m2: => Map[K, M[T]]) = {
val mMin = List(m1, m2).minBy(_.size)
mMin.foldLeft(m2){ case (acc, (k, vs)) =>
acc.get(k) match {
case Some(vs2) => acc.updated(k, mo.append(vs, vs2))
case None => acc + (k -> vs)
}
}
}
}
Map(1 -> Set(1, 2)) |+| Map(1 -> Set(3, 4)) |+| Map(1 -> Set(5, 6)) // Map(1 -> Set(5, 1, 6, 2, 3, 4))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment