diff options
author | Allan Wang <me@allanwang.ca> | 2017-12-26 05:05:37 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-26 05:05:37 -0500 |
commit | 23b9f24503130f1f3d29f0ab7a33ea3a08e0c064 (patch) | |
tree | 53349836d81f0d1765348df82d8a049e5047bb12 /core | |
parent | 7a3165ac7404381eb85ea40525db1a7a7d980761 (diff) | |
download | kau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.tar.gz kau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.tar.bz2 kau-23b9f24503130f1f3d29f0ab7a33ea3a08e0c064.zip |
Create flyweight (#118)
Diffstat (limited to 'core')
-rw-r--r-- | core/src/main/kotlin/ca/allanwang/kau/kotlin/FlyWeight.kt | 40 |
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 |