aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/package.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2017-04-24 14:10:46 +0200
committerIvan Topolnjak <ivantopo@gmail.com>2017-04-24 14:17:10 +0200
commitbbd52dcca66caa3cbd78478a1d075ff54da4f65a (patch)
treed121b293a21a14e5d4d19946b44e6008257f8db3 /kamon-core/src/main/scala/kamon/package.scala
parent4d828e1a3195e55365c865aa3a78af9668742643 (diff)
downloadKamon-bbd52dcca66caa3cbd78478a1d075ff54da4f65a.tar.gz
Kamon-bbd52dcca66caa3cbd78478a1d075ff54da4f65a.tar.bz2
Kamon-bbd52dcca66caa3cbd78478a1d075ff54da4f65a.zip
bring the new skeleton into place
Diffstat (limited to 'kamon-core/src/main/scala/kamon/package.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/package.scala49
1 files changed, 49 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/package.scala b/kamon-core/src/main/scala/kamon/package.scala
new file mode 100644
index 00000000..3d8c3515
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/package.scala
@@ -0,0 +1,49 @@
+import com.typesafe.config.Config
+
+import scala.collection.concurrent.TrieMap
+
+package object kamon {
+
+
+
+ /**
+ * Workaround to the non thread-safe [[scala.collection.concurrent.TrieMap#getOrElseUpdate]] method. More details on
+ * why this is necessary can be found at [[https://issues.scala-lang.org/browse/SI-7943]].
+ */
+ implicit class AtomicGetOrElseUpdateOnTrieMap[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).map { oldValue ⇒
+ // If there was an old value then `d` was never added
+ // and thus need to be cleanup.
+ cleanup(d)
+ oldValue
+
+ } getOrElse (d)
+ }
+ }
+
+
+ implicit class UtilsOnConfig(val config: Config) extends AnyVal {
+ import scala.collection.JavaConverters._
+
+ def firstLevelKeys: Set[String] = {
+ config.entrySet().asScala.map {
+ case entry ⇒ entry.getKey.takeWhile(_ != '.')
+ } toSet
+ }
+
+ def configurations: Map[String, Config] = {
+ firstLevelKeys
+ .map(entry => (entry, config.getConfig(entry)))
+ .toMap
+ }
+ }
+}