summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/LifecycleUtils.kt
blob: d5c19c681e051cd2a6a3556e5fc2bc2699417666 (plain) (blame)
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
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

package org.yuzu.yuzu_emu.utils

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch

/**
 * Collects this [Flow] with a given [LifecycleOwner].
 * @param scope [LifecycleOwner] that this [Flow] will be collected with.
 * @param repeatState When to repeat collection on this [Flow].
 * @param resetState Optional lambda to reset state of an underlying [MutableStateFlow] after
 * [stateCollector] has been run.
 * @param stateCollector Lambda that receives new state.
 */
inline fun <reified T> Flow<T>.collect(
    scope: LifecycleOwner,
    repeatState: Lifecycle.State = Lifecycle.State.CREATED,
    crossinline resetState: () -> Unit = {},
    crossinline stateCollector: (state: T) -> Unit
) {
    scope.apply {
        lifecycleScope.launch {
            repeatOnLifecycle(repeatState) {
                this@collect.collect {
                    stateCollector(it)
                    resetState()
                }
            }
        }
    }
}