in storehaus-algebra/src/main/scala/com/twitter/storehaus/algebra/MutableCacheAlgebra.scala [42:65]
def inject[U](injection: Injection[(K, U), (K, V)]): MutableCache[K, U] =
new MutableCache[K, U] {
override def get(k: K) = for {
v <- cache.get(k)
(_, u) <- injection.invert((k, v)).toOption
} yield u
override def +=(ku: (K, U)) = { cache += injection(ku); this }
override def hit(k: K) =
cache.hit(k)
.flatMap(v => injection.invert((k, v)).toOption).map(_._2)
override def evict(k: K) = for {
evictedV <- cache.evict(k)
(_, evictedU) <- injection.invert((k, evictedV)).toOption
} yield evictedU
override def empty = new AlgebraicMutableCache(cache.empty).inject(injection)
override def clear = { cache.clear; this }
override def iterator =
cache.iterator.flatMap(injection.invert(_).toOption)
}