summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/defaultimpl/GlobalAddedDataManagerImpl.kt
blob: 49ab71f53642a1fbca3ee42e3ad16680de1c47e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@file:Suppress("UNCHECKED_CAST")

package io.dico.parcels2.defaultimpl

import io.dico.parcels2.*
import io.dico.parcels2.util.ext.alsoIfTrue
import java.util.Collections

class GlobalAddedDataManagerImpl(val plugin: ParcelsPlugin) : GlobalAddedDataManager {
    private val map = mutableMapOf<PlayerProfile, GlobalAddedData>()

    override fun get(owner: PlayerProfile): GlobalAddedData {
        return map[owner] ?: GlobalAddedDataImpl(owner).also { map[owner] = it }
    }

    private inner class GlobalAddedDataImpl(override val owner: PlayerProfile,
                                            data: MutableAddedDataMap = emptyData)
        : AddedDataHolder(data), GlobalAddedData {

        private inline var data get() = addedMap; set(value) = run { addedMap = value }
        private inline val isEmpty get() = data === emptyData

        override fun setAddedStatus(key: StatusKey, status: AddedStatus): Boolean {
            if (isEmpty) {
                if (status == AddedStatus.DEFAULT) return false
                data = mutableMapOf()
            }
            return super.setAddedStatus(key, status).alsoIfTrue {
                plugin.storage.setGlobalAddedStatus(owner, key, status)
            }
        }
    }

    private companion object {
        val emptyData = Collections.emptyMap<Any, Any>() as MutableAddedDataMap
    }

}