diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2015-02-04 05:32:45 +0100 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2015-02-04 05:32:45 +0100 |
commit | 82a110b23ca57286e4e3dd0315c20ed99b5e8f88 (patch) | |
tree | 830dc660c5597707407ac7c280f332f7dd4c9ede /kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala | |
parent | 1b39bfb30e338c3d6c8284ae1276fb0c7eae7cc7 (diff) | |
download | Kamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.tar.gz Kamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.tar.bz2 Kamon-82a110b23ca57286e4e3dd0315c20ed99b5e8f88.zip |
! core: revised semantics of .register on Metrics module to match our docs.
Diffstat (limited to 'kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala b/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala index 5ad43c34..d1197a5a 100644 --- a/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala +++ b/kamon-core/src/main/scala/kamon/util/TriemapAtomicGetOrElseUpdate.scala @@ -24,10 +24,22 @@ object TriemapAtomicGetOrElseUpdate { * why this is necessary can be found at [[https://issues.scala-lang.org/browse/SI-7943]]. */ implicit class Syntax[K, V](val trieMap: TrieMap[K, V]) extends AnyVal { + def atomicGetOrElseUpdate(key: K, op: ⇒ V): V = + atomicGetOrElseUpdate(key, op, { v: V ⇒ Unit }) + + def atomicGetOrElseUpdate(key: K, op: ⇒ V, cleanup: V ⇒ Unit): V = trieMap.get(key) match { case Some(v) ⇒ v - case None ⇒ val d = op; trieMap.putIfAbsent(key, d).getOrElse(d) + case None ⇒ + val d = op + trieMap.putIfAbsent(key, d).map { oldValue ⇒ + // If there was an old value then `d` was never added + // and thus need to be cleanup. + cleanup(d) + oldValue + + } getOrElse (d) } } } |