import io.sellmair.evas.State import io.sellmair.evas.collectEventsAsync import io.sellmair.evas.launchState import kotlinx.coroutines.CoroutineScope data class SummaryState( val files: Int, val directories: Int, val size: Long, ) : State { companion object Key : State.Key { override val default: SummaryState = SummaryState(files = 0, directories = 0, size = 0) } } fun CoroutineScope.launchSummaryState() = launchState(SummaryState) { var statistics = SummaryState.default collectEventsAsync { statistics = statistics.copy(directories = statistics.directories + 1) statistics.emit() } collectEventsAsync { event -> statistics = statistics.copy( files = statistics.files + 1, size = statistics.size + (event.metadata.size ?: 0) ) statistics.emit() } }