
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