aboutsummaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-12-26 05:05:37 -0500
committerGitHub <noreply@github.com>2017-12-26 05:05:37 -0500
commit23b9f24503130f1f3d29f0ab7a33ea3a08e0c064 (patch)
tree53349836d81f0d1765348df82d8a049e5047bb12 /core/src/main
parent7a3165ac7404381eb85ea40525db1a7a7d980761 (diff)
downloadkau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.tar.gz
kau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.tar.bz2
kau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.zip
Create flyweight (#118)
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/kotlin/ca/allanwang/kau/kotlin/FlyWeight.kt40
1 files changed, 40 insertions, 0 deletions
diff --git a/core/src/main/kotlin/ca/allanwang/kau/kotlin/FlyWeight.kt b/core/src/main/kotlin/ca/allanwang/kau/kotlin/FlyWeight.kt
new file mode 100644
index 0000000..03e98d2
--- /dev/null
+++ b/core/src/main/kotlin/ca/allanwang/kau/kotlin/FlyWeight.kt
@@ -0,0 +1,40 @@
+package ca.allanwang.kau.kotlin
+
+/**
+ * Created by Allan Wang on 26/12/17.
+ *
+ * Kotlin implementation of a flyweight design pattern
+ * Values inside the map will be returned directly
+ * Otherwise, it will be created with the supplier, saved, and returned
+ * In the event a default is provided, the default takes precedence
+ */
+fun <K : Any, V : Any> flyweight(creator: (K) -> V) = FlyWeight(creator)
+
+class FlyWeight<K : Any, V : Any>(private val creator: (key: K) -> V) : Map<K, V> {
+
+ private val map = mutableMapOf<K, V>()
+
+ override val entries: Set<Map.Entry<K, V>>
+ get() = map.entries
+ override val keys: Set<K>
+ get() = map.keys
+ override val size: Int
+ get() = map.size
+ override val values: Collection<V>
+ get() = map.values
+
+ override fun containsKey(key: K) = map.containsKey(key)
+
+ override fun containsValue(value: V) = map.containsValue(value)
+
+ override fun getOrDefault(key: K, defaultValue: V) = map.getOrDefault(key, defaultValue)
+
+ override fun isEmpty() = map.isEmpty()
+
+ override fun get(key: K): V {
+ if (!map.containsKey(key))
+ map.put(key, creator(key))
+ return map[key]!!
+ }
+
+} \ No newline at end of file