Advertisement
mitrakov

Merging maps

Nov 5th, 2019
662
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 0.53 KB | None | 0 0
  1. import cats.kernel.Semigroup
  2.  
  3. def mergeMap[K, V](left: Map[K, V], right: Map[K, V]): Map[K, List[V]] = {
  4.   import cats.implicits._
  5.   def optCombine[A: Semigroup](a: A, optB: Option[A]): A = optB.map(b => if (a == b) a else a |+| b).getOrElse(a)
  6.   def merge[K, V : Semigroup](left: Map[K, V], right: Map[K, V]): Map[K, V] = {
  7.     left.foldLeft(right) { case (acc, (k, v)) => acc.updated(k, optCombine(v, acc.get(k)))}
  8.   }
  9.   val l = left.map{ case (k, v) => k -> List(v)}
  10.   val r = right.map{ case (k, v) => k -> List(v)}
  11.   merge(l, r)
  12. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement