Files
muza/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/TimerJob.kt
2022-07-23 16:57:38 +02:00

41 lines
1.1 KiB
Kotlin

package it.vfsfitvnm.vimusic.utils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
interface TimerJob {
val millisLeft: StateFlow<Long?>
fun cancel()
}
fun CoroutineScope.timer(delayMillis: Long, onCompletion: () -> Unit): TimerJob {
val millisLeft = MutableStateFlow<Long?>(delayMillis)
val job = launch {
while (isActive && millisLeft.value != null) {
delay(1000)
millisLeft.emit(millisLeft.value?.minus(1000)?.takeIf { it > 0 })
}
}
val disposableHandle = job.invokeOnCompletion {
if (it == null) {
onCompletion()
}
}
return object : TimerJob {
override val millisLeft: StateFlow<Long?>
get() = millisLeft.asStateFlow()
override fun cancel() {
millisLeft.value = null
disposableHandle.dispose()
job.cancel()
}
}
}