Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
data.PluginDataExtensions.kt Maven / Gradle / Ivy
/*
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("unused", "INAPPLICABLE_JVM_NAME", "INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
package net.mamoe.mirai.console.data
import net.mamoe.mirai.console.data.PluginDataExtensions.withDefault
import net.mamoe.mirai.console.internal.data.ShadowMap
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import kotlin.internal.LowPriorityInOverloadResolution
/**
* [PluginData] 相关一些扩展
*/
public object PluginDataExtensions {
@ConsoleExperimentalApi
public open class NotNullMap internal constructor(
private val delegate: Map
) : Map by delegate {
override fun get(key: K): V =
delegate[key] ?: error("Internal error: delegate[key] returned null for NotNullMap.get")
@Deprecated(
"getOrDefault on NotNullMap always returns the value in the map, and defaultValue will never be returned.",
level = DeprecationLevel.WARNING,
replaceWith = ReplaceWith("this.get(key)")
)
override fun getOrDefault(key: K, defaultValue: V): V {
return super.getOrDefault(key, defaultValue)
}
}
@Suppress("DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE") // as designed
public class NotNullMutableMap internal constructor(
private val delegate: MutableMap
) : MutableMap by delegate, NotNullMap(delegate) {
override fun get(key: K): V =
delegate[key] ?: error("Internal error: delegate[key] returned null for NotNullMutableMap.get")
@Deprecated(
"getOrDefault on NotNullMutableMap always returns the value in the map, and defaultValue will never be returned.",
level = DeprecationLevel.WARNING,
replaceWith = ReplaceWith("this.get(key)")
)
override fun getOrDefault(key: K, defaultValue: V): V {
return super.getOrDefault(key, defaultValue)
}
@Deprecated(
"putIfAbsent on NotNullMutableMap always does nothing.",
level = DeprecationLevel.WARNING,
replaceWith = ReplaceWith("")
)
override fun putIfAbsent(key: K, value: V): Nothing? = null
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)
*
* @see withDefault
*/
@JvmName("withEmptyDefaultMapImmutable")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { LinkedHashMap() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashMap], 再从 [this] 中取出链接自动保存的 [LinkedHashMap]. ([MutableMap.getOrPut] 的替代)
* @see withDefault
*/
@JvmName("withEmptyDefaultMap")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { LinkedHashMap() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].
* @see withDefault
*/
@JvmName("withEmptyDefaultListImmutable")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { ArrayList() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [ArrayList], 再从 [this] 中取出链接自动保存的 [ArrayList].
* @see withDefault
*/
@JvmName("withEmptyDefaultList")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { ArrayList() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].
* @see withDefault
*/
@JvmName("withEmptyDefaultSetImmutable")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { LinkedHashSet() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先放入一个 [LinkedHashSet], 再从 [this] 中取出链接自动保存的 [LinkedHashSet].
* @see withDefault
*/
@JvmName("withEmptyDefaultSet")
@JvmStatic
public fun SerializerAwareValue>>.withEmptyDefault(): SerializerAwareValue>> {
return this.withDefault { LinkedHashSet() }
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
*/
@JvmStatic
@JvmName("withDefaultMapImmutableNotNull")
public fun SerializerAwareValue>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue> {
@Suppress("UNCHECKED_CAST") // magic
return (this as SerializerAwareValue>).withDefault(defaultValueComputer) as SerializerAwareValue>
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
*/
@JvmStatic
@LowPriorityInOverloadResolution
@JvmName("withDefaultMapImmutable")
public fun SerializerAwareValue>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue> {
@Suppress("UNCHECKED_CAST") // magic
return (this as SerializerAwareValue>).withDefault(defaultValueComputer) as SerializerAwareValue>
}
@JvmStatic
@JvmName("withDefaultMapNotNull")
public fun SerializerAwareValue>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
private val instance = NotNullMutableMap(createDelegateInstance(origin, defaultValueComputer))
override var value: Map
get() = instance
set(value) {
origin.value = value as MutableMap // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
/**
* 创建一个代理对象, 当 [Map.get] 返回 `null` 时先调用 [defaultValueComputer] 并放入 [Map], 再返回调用的返回值
*/
@LowPriorityInOverloadResolution
@JvmStatic
@JvmName("withDefaultMap")
public fun SerializerAwareValue>.withDefault(defaultValueComputer: (K) -> V): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
private val instance = createDelegateInstance(origin, defaultValueComputer)
override var value: Map
get() = instance
set(value) {
origin.value = value as MutableMap // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
private fun createDelegateInstance(
origin: SerializerAwareValue>,
defaultValueComputer: (K) -> V,
): MutableMap {
return object : MutableMap, AbstractMap() {
override val entries: MutableSet> get() = origin.value.entries
override val keys: MutableSet get() = origin.value.keys
override val values: MutableCollection get() = origin.value.values
override fun clear() = origin.value.clear()
override fun putAll(from: Map) = origin.value.putAll(from)
override fun remove(key: K): V? = origin.value.remove(key)
override fun put(key: K, value: V): V? = origin.value.put(key, value)
override fun get(key: K): V? {
// the only difference
val result = origin.value[key]
if (result != null) return result
put(key, defaultValueComputer(key))
return origin.value[key]
}
}
}
/**
* 替换 [MutableMap] 的 key
*/
@JvmName("mapKeysNotNull")
@JvmStatic
public fun SerializerAwareValue>.mapKeys(
oldToNew: (OldK) -> NewK,
newToOld: (NewK) -> OldK,
): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
private val instance =
NotNullMutableMap(ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it }))
override var value: Map
get() = instance
set(value) {
origin.value =
value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
/**
* 替换 [MutableMap] 的 key
*/
@JvmName("mapKeys")
@JvmStatic
public fun SerializerAwareValue>.mapKeys(
oldToNew: (OldK) -> NewK,
newToOld: (NewK) -> OldK,
): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
private val instance = ShadowMap({ origin.value }, oldToNew, newToOld, { it }, { it })
override var value: Map
get() = instance
set(value) {
origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
/**
* 替换 [Map] 的 key
*/
@JvmName("mapKeysImmutable")
@JvmStatic
public fun SerializerAwareValue>.mapKeys(
oldToNew: (OldK) -> NewK,
newToOld: (NewK) -> OldK,
): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
// casting Map to MutableMap is OK here, as we don't call mutable functions
private val instance =
ShadowMap({ origin.value as MutableMap }, oldToNew, newToOld, { it }, { it })
override var value: Map
get() = instance
set(value) {
origin.value = value.mapKeysTo(LinkedHashMap()) { it.key.let(newToOld) } // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
/**
* 替换 [Map] 的 key
*/
@JvmName("mapKeysImmutableNotNull")
@JvmStatic
public fun SerializerAwareValue>.mapKeys(
oldToNew: (OldK) -> NewK,
newToOld: (NewK) -> OldK,
): SerializerAwareValue> {
val origin = this
@Suppress("UNCHECKED_CAST")
return SerializableValue(
object : CompositeMapValue {
// casting Map to MutableMap is OK here, as we don't call mutable functions
private val instance =
NotNullMap(ShadowMap({ origin.value as MutableMap }, oldToNew, newToOld, { it }, { it }))
override var value: Map
get() = instance
set(value) {
origin.value =
value.mapKeysTo(NotNullMutableMap(LinkedHashMap())) { it.key.let(newToOld) } // erased cast
}
} as Value>, // erased cast
this.serializer
)
}
}