ConflatedEventBus.kt
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.paging
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.mapNotNull
/**
* Simple bus implementation thats acts like a ConflatedBroadcastChannel based on StateFlow.
* * It allows not setting an initial value
* * Sending duplicate values is allowed
*/
@OptIn(ExperimentalCoroutinesApi::class)
internal class ConflatedEventBus<T : Any>(initialValue: T? = null) {
private val state = MutableStateFlow(Pair(Integer.MIN_VALUE, initialValue))
val flow = state.mapNotNull { it.second }
fun send(data: T) {
state.value = Pair(state.value.first + 1, data)
}
}