All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.storehaus.algebra.ConcurrentHashMapMergeableStore.scala Maven / Gradle / Ivy

There is a newer version: 0.15.0-RC1
Show newest version

package com.twitter.storehaus.algebra

import com.twitter.algebird.Semigroup
import com.twitter.util.{Closable, Future, Time}
import java.util.concurrent.{ ConcurrentHashMap => JConcurrentHashMap }

object ConcurrentHashMapMergeableStore {
  def apply[K, V: Semigroup](): ConcurrentHashMapMergeableStore[K, V] =
    new ConcurrentHashMapMergeableStore[K, V](new JConcurrentHashMap[K, V])
}

/** A threadsafe local MergeableStore
 *  useful for testing or other local applications
 */
class ConcurrentHashMapMergeableStore[K, V](map: JConcurrentHashMap[K, V])(
  implicit val semigroup: Semigroup[V]) extends MergeableStore[K, V] {

  override def get(k: K): Future[Option[V]] = Future.value(Option(map.get(k)))
  override def put(kv: (K, Option[V])): Future[Unit] = kv match {
    case (k, Some(v)) => map.put(k, v); Future.Unit
    case (k, None) => map.remove(k); Future.Unit
  }

  override def merge(kv: (K, V)): Future[Option[V]] = {
    val (k, v) = kv
    map.get(k) match {
      case null =>
        if (null == map.putIfAbsent(k, v)) Future.None
        else merge(kv)
      case oldV =>
        if (map.replace(k, oldV, semigroup.plus(oldV, v))) Future.value(Some(oldV))
        else merge(kv)
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy