PluginDataExtensions.kt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /*
  2. * Copyright 2019-2020 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/master/LICENSE
  8. */
  9. @file:Suppress("unused", "INAPPLICABLE_JVM_NAME", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
  10. package net.mamoe.mirai.console.data
  11. import net.mamoe.mirai.console.data.PluginDataExtensions.withDefault
  12. import net.mamoe.mirai.console.internal.data.ShadowMap
  13. import net.mamoe.mirai.console.util.ConsoleExperimentalApi
  14. import kotlin.internal.LowPriorityInOverloadResolution
  15. /**
  16. * [PluginData] 相关一些扩展
  17. */
  18. public object PluginDataExtensions {
  19. @ConsoleExperimentalApi
  20. public open class NotNullMap<K, V> internal constructor(
  21. private val delegate: Map<K, V>
  22. ) : Map<K, V> by delegate {
  23. override fun get(key: K): V =
  24. delegate[key] ?: error("Internal error: delegate[key] returned null for NotNullMap.get")
  25. @Deprecated(
  26. "getOrDefault on NotNullMap always returns the value in the map, and defaultValue will never be returned.",
  27. level = DeprecationLevel.WARNING,
  28. replaceWith = ReplaceWith("this.get(key)")
  29. )
  30. override fun getOrDefault(key: K, defaultValue: V): V {
  31. return super.getOrDefault(key, defaultValue)
  32. }
  33. }
  34. @Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") // as designed
  35. public class NotNullMutableMap<K, V> internal constructor(
  36. private val delegate: MutableMap<K, V>
  37. ) : MutableMap<K, V> by delegate, NotNullMap<K, V>(delegate) {
  38. override fun get(key: K): V =
  39. delegate[key] ?: error("Internal error: delegate[key] returned null for NotNullMutableMap.get")
  40. @Deprecated(
  41. "getOrDefault on NotNullMutableMap always returns the value in the map, and defaultValue will never be returned.",
  42. level = DeprecationLevel.WARNING,
  43. replaceWith = ReplaceWith("this.get(key)")
  44. )
  45. override fun getOrDefault(key: K, defaultValue: V): V {
  46. return super<MutableMap>.getOrDefault(key, defaultValue)
  47. }
  48. @Deprecated(
  49. "putIfAbsent on NotNullMutableMap always does nothing.",
  50. level = DeprecationLevel.WARNING,
  51. replaceWith = ReplaceWith("")
  52. )
  53. override fun putIfAbsent(key: K, value: V): Nothing? = null
  54. }
  55. /**
  56. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)
  57. *
  58. * @see withDefault
  59. */
  60. @JvmName("withEmptyDefaultMapImmutable")
  61. @JvmStatic
  62. public fun <K, InnerE, InnerV> SerializerAwareValue<MutableMap<K, Map<InnerE, InnerV>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, Map<InnerE, InnerV>>> {
  63. return this.withDefault { LinkedHashMap() }
  64. }
  65. /**
  66. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)
  67. * @see withDefault
  68. */
  69. @JvmName("withEmptyDefaultMap")
  70. @JvmStatic
  71. public fun <K, InnerE, InnerV> SerializerAwareValue<MutableMap<K, MutableMap<InnerE, InnerV>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableMap<InnerE, InnerV>>> {
  72. return this.withDefault { LinkedHashMap() }
  73. }
  74. /**
  75. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].
  76. * @see withDefault
  77. */
  78. @JvmName("withEmptyDefaultListImmutable")
  79. @JvmStatic
  80. public fun <K, E> SerializerAwareValue<MutableMap<K, List<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, List<E>>> {
  81. return this.withDefault { ArrayList() }
  82. }
  83. /**
  84. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].
  85. * @see withDefault
  86. */
  87. @JvmName("withEmptyDefaultList")
  88. @JvmStatic
  89. public fun <K, E> SerializerAwareValue<MutableMap<K, MutableList<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableList<E>>> {
  90. return this.withDefault { ArrayList() }
  91. }
  92. /**
  93. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].
  94. * @see withDefault
  95. */
  96. @JvmName("withEmptyDefaultSetImmutable")
  97. @JvmStatic
  98. public fun <K, E> SerializerAwareValue<MutableMap<K, Set<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, Set<E>>> {
  99. return this.withDefault { LinkedHashSet() }
  100. }
  101. /**
  102. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].
  103. * @see withDefault
  104. */
  105. @JvmName("withEmptyDefaultSet")
  106. @JvmStatic
  107. public fun <K, E> SerializerAwareValue<MutableMap<K, MutableSet<E>>>.withEmptyDefault(): SerializerAwareValue<NotNullMutableMap<K, MutableSet<E>>> {
  108. return this.withDefault { LinkedHashSet() }
  109. }
  110. /**
  111. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
  112. */
  113. @JvmStatic
  114. @JvmName("withDefaultMapImmutableNotNull")
  115. public fun <K, V : Any> SerializerAwareValue<Map<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<NotNullMap<K, V>> {
  116. @Suppress("UNCHECKED_CAST") // magic
  117. return (this as SerializerAwareValue<MutableMap<K, V>>).withDefault(defaultValueComputer) as SerializerAwareValue<NotNullMap<K, V>>
  118. }
  119. /**
  120. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
  121. */
  122. @JvmStatic
  123. @LowPriorityInOverloadResolution
  124. @JvmName("withDefaultMapImmutable")
  125. public fun <K, V> SerializerAwareValue<Map<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<Map<K, V>> {
  126. @Suppress("UNCHECKED_CAST") // magic
  127. return (this as SerializerAwareValue<MutableMap<K, V>>).withDefault(defaultValueComputer) as SerializerAwareValue<Map<K, V>>
  128. }
  129. @JvmStatic
  130. @JvmName("withDefaultMapNotNull")
  131. public fun <K, V : Any> SerializerAwareValue<MutableMap<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<NotNullMutableMap<K, V>> {
  132. val origin = this
  133. @Suppress("UNCHECKED_CAST")
  134. return SerializableValue(
  135. object : CompositeMapValue<K, V> {
  136. private val instance = NotNullMutableMap(createDelegateInstance(origin, defaultValueComputer))
  137. override var value: Map<K, V>
  138. get() = instance
  139. set(value) {
  140. origin.value = value as MutableMap<K, V> // erased cast
  141. }
  142. } as Value<NotNullMutableMap<K, V>>, // erased cast
  143. this.serializer
  144. )
  145. }
  146. /**
  147. * 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
  148. */
  149. @LowPriorityInOverloadResolution
  150. @JvmStatic
  151. @JvmName("withDefaultMap")
  152. public fun <K, V> SerializerAwareValue<MutableMap<K, V>>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue<MutableMap<K, V>> {
  153. val origin = this
  154. @Suppress("UNCHECKED_CAST")
  155. return SerializableValue(
  156. object : CompositeMapValue<K, V> {
  157. private val instance = createDelegateInstance(origin, defaultValueComputer)
  158. override var value: Map<K, V>
  159. get() = instance
  160. set(value) {
  161. origin.value = value as MutableMap<K, V> // erased cast
  162. }
  163. } as Value<MutableMap<K, V>>, // erased cast
  164. this.serializer
  165. )
  166. }
  167. private fun <K, V> createDelegateInstance(
  168. origin: SerializerAwareValue<MutableMap<K, V>>,
  169. defaultValueComputer: (K) -> V,
  170. ): MutableMap<K, V> {
  171. return object : MutableMap<K, V>, AbstractMap<K, V>() {
  172. override val entries: MutableSet<MutableMap.MutableEntry<K, V>> get() = origin.value.entries
  173. override val keys: MutableSet<K> get() = origin.value.keys
  174. override val values: MutableCollection<V> get() = origin.value.values
  175. override fun clear() = origin.value.clear()
  176. override fun putAll(from: Map<out K, V>) = origin.value.putAll(from)
  177. override fun remove(key: K): V? = origin.value.remove(key)
  178. override fun put(key: K, value: V): V? = origin.value.put(key, value)
  179. override fun get(key: K): V? {
  180. // the only difference
  181. val result = origin.value[key]
  182. if (result != null) return result
  183. put(key, defaultValueComputer(key))
  184. return origin.value[key]
  185. }
  186. }
  187. }
  188. /**
  189. * 替换 [MutableMap] 的 key
  190. */
  191. @JvmName("mapKeysNotNull")
  192. @JvmStatic
  193. public fun <OldK, NewK, V : Any> SerializerAwareValue<NotNullMutableMap<OldK, V>>.mapKeys(
  194. oldToNew: (OldK) -> NewK,
  195. newToOld: (NewK) -> OldK,
  196. ): SerializerAwareValue<NotNullMutableMap<NewK, V>> {
  197. val origin = this
  198. @Suppress("UNCHECKED_CAST")
  199. return SerializableValue(
  200. object : CompositeMapValue<NewK, V> {
  201. private val instance =
  202. NotNullMutableMap(ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it }))
  203. override var value: Map<NewK, V>
  204. get() = instance
  205. set(value) {
  206. origin.value =
  207. value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast
  208. }
  209. } as Value<NotNullMutableMap<NewK, V>>, // erased cast
  210. this.serializer
  211. )
  212. }
  213. /**
  214. * 替换 [MutableMap] 的 key
  215. */
  216. @JvmName("mapKeys")
  217. @JvmStatic
  218. public fun <OldK, NewK, V> SerializerAwareValue<MutableMap<OldK, V>>.mapKeys(
  219. oldToNew: (OldK) -> NewK,
  220. newToOld: (NewK) -> OldK,
  221. ): SerializerAwareValue<MutableMap<NewK, V>> {
  222. val origin = this
  223. @Suppress("UNCHECKED_CAST")
  224. return SerializableValue(
  225. object : CompositeMapValue<NewK, V> {
  226. private val instance = ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it })
  227. override var value: Map<NewK, V>
  228. get() = instance
  229. set(value) {
  230. origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast
  231. }
  232. } as Value<MutableMap<NewK, V>>, // erased cast
  233. this.serializer
  234. )
  235. }
  236. /**
  237. * 替换 [Map] 的 key
  238. */
  239. @JvmName("mapKeysImmutable")
  240. @JvmStatic
  241. public fun <OldK, NewK, V> SerializerAwareValue<Map<OldK, V>>.mapKeys(
  242. oldToNew: (OldK) -> NewK,
  243. newToOld: (NewK) -> OldK,
  244. ): SerializerAwareValue<Map<NewK, V>> {
  245. val origin = this
  246. @Suppress("UNCHECKED_CAST")
  247. return SerializableValue(
  248. object : CompositeMapValue<NewK, V> {
  249. // casting Map to MutableMap is OK here, as we don't call mutable functions
  250. private val instance =
  251. ShadowMap({ origin.value as MutableMap<OldK, V> }, oldToNew, newToOld, { it }, { it })
  252. override var value: Map<NewK, V>
  253. get() = instance
  254. set(value) {
  255. origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast
  256. }
  257. } as Value<Map<NewK, V>>, // erased cast
  258. this.serializer
  259. )
  260. }
  261. /**
  262. * 替换 [Map] 的 key
  263. */
  264. @JvmName("mapKeysImmutableNotNull")
  265. @JvmStatic
  266. public fun <OldK, NewK, V : Any> SerializerAwareValue<NotNullMap<OldK, V>>.mapKeys(
  267. oldToNew: (OldK) -> NewK,
  268. newToOld: (NewK) -> OldK,
  269. ): SerializerAwareValue<NotNullMap<NewK, V>> {
  270. val origin = this
  271. @Suppress("UNCHECKED_CAST")
  272. return SerializableValue(
  273. object : CompositeMapValue<NewK, V> {
  274. // casting Map to MutableMap is OK here, as we don't call mutable functions
  275. private val instance =
  276. NotNullMap(ShadowMap({ origin.value as MutableMap<OldK, V> }, oldToNew, newToOld, { it }, { it }))
  277. override var value: Map<NewK, V>
  278. get() = instance
  279. set(value) {
  280. origin.value =
  281. value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast
  282. }
  283. } as Value<NotNullMap<NewK, V>>, // erased cast
  284. this.serializer
  285. )
  286. }
  287. }