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

commonMain.me.aartikov.replica.keyed.ClearPolicy.kt Maven / Gradle / Ivy

package me.aartikov.replica.keyed

import me.aartikov.replica.common.ObservingState
import me.aartikov.replica.single.ReplicaData
import me.aartikov.replica.single.ReplicaState

/**
 * Configures how [KeyedPhysicalReplica] clears children when child count exceeds [KeyedReplicaSettings.maxCount].
 * @property clearOrder see [ClearOrder]
 * @property isPrivilegedReplica allows to set privileged replicas. Privileged replica is cleared only if there is no non-privileged one.
 */
data class ClearPolicy(
    val clearOrder: ClearOrder = ClearOrder.ByObservingTime,
    val isPrivilegedReplica: ((Pair>) -> Boolean)? = null
) {
    internal val comparator: Comparator>> = when (clearOrder) {
        ClearOrder.ByObservingTime -> ClearOrder.ByObservingTime.getComparator()
        ClearOrder.ByDataChangingTime -> ClearOrder.ByDataChangingTime.getComparator()
        is ClearOrder.CustomComparator -> clearOrder.comparator
    }.withPrivileged(isPrivilegedReplica)
}

/**
 * Configures in which order [KeyedPhysicalReplica] clears children when child count exceeds [KeyedReplicaSettings.maxCount].
 */
sealed interface ClearOrder {

    /**
     * Compares replicas by [ObservingState.observingTime].
     */
    data object ByObservingTime : ClearOrder {
        internal fun  getComparator(): Comparator>> {
            return Comparator { o1, o2 ->
                compareValues(
                    o1.second.observingState.observingTime,
                    o2.second.observingState.observingTime
                )
            }
        }
    }

    /**
     * Compares replicas by [ReplicaData.changingTime].
     */
    data object ByDataChangingTime : ClearOrder {
        internal fun  getComparator(): Comparator>> {
            return Comparator { o1, o2 ->
                compareValues(
                    o1.second.data?.changingTime,
                    o2.second.data?.changingTime
                )
            }
        }
    }

    /**
     * Allows to specify custom comparator.
     */
    data class CustomComparator(
        val comparator: Comparator>>
    ) : ClearOrder
}

private fun  Comparator>>.withPrivileged(
    isPrivilegedReplica: ((Pair>) -> Boolean)?
): Comparator>> {
    return if (isPrivilegedReplica == null) {
        this
    } else {
        Comparator { o1, o2 ->
            val privileged1 = isPrivilegedReplica(o1)
            val privileged2 = isPrivilegedReplica(o2)
            when {
                privileged1 && !privileged2 -> 1
                !privileged1 && privileged2 -> -1
                else -> this.compare(o1, o2)
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy