All Downloads are FREE. Search and download functionalities are using the official Maven repository.

data.PluginDataExtensions.kt Maven / Gradle / Ivy

There is a newer version: 2.16.0
Show newest version
/*
 * 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
        )
    }
}











































© 2015 - 2024 Weber Informatics LLC | Privacy Policy