package scalaz
package std.java.util

trait MapInstances {

  import java.util.Map.Entry
  import java.util.AbstractMap.SimpleImmutableEntry

  implicit def mapEntryBitraverse: Bitraverse[Entry] = new Bitraverse[Entry] {
    override def bimap[A, B, C, D](fab: Entry[A, B])(f: A => C, g: B => D) =
      new SimpleImmutableEntry(f(fab.getKey), g(fab.getValue))

    def bitraverseImpl[G[_]: Applicative, A, B, C, D](fab: Entry[A, B])
                                                 (f: A => G[C], g: B => G[D]) =
      Applicative[G].apply2(f(fab.getKey), g(fab.getValue))(new SimpleImmutableEntry(_, _))

  }
}

object map extends MapInstances