package de.timklge.karooheadwind import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.models.ActiveRidePage import io.hammerhead.karooext.models.OnLocationChanged import io.hammerhead.karooext.models.OnNavigationState import io.hammerhead.karooext.models.OnStreamState import io.hammerhead.karooext.models.RideState import io.hammerhead.karooext.models.StreamState import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.transform fun KarooSystemService.streamDataFlow(dataTypeId: String): Flow { return callbackFlow { val listenerId = addConsumer(OnStreamState.StartStreaming(dataTypeId)) { event: OnStreamState -> trySendBlocking(event.state) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamLocation(): Flow { return callbackFlow { val listenerId = addConsumer { event: OnLocationChanged -> trySendBlocking(event) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamNavigationState(): Flow { return callbackFlow { val listenerId = addConsumer { event: OnNavigationState -> trySendBlocking(event) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamRideState(): Flow { return callbackFlow { val listenerId = addConsumer { event: RideState -> trySendBlocking(event) } awaitClose { removeConsumer(listenerId) } } } fun Flow.throttle(timeout: Long): Flow = this .conflate() .transform { emit(it) delay(timeout) } fun KarooSystemService.streamActiveRidePage(): Flow { return callbackFlow { val listenerId = addConsumer { activeRidePage: ActiveRidePage -> trySendBlocking(activeRidePage) } awaitClose { removeConsumer(listenerId) } } } fun KarooSystemService.streamDatatypeIsVisible( datatype: String, ): Flow { return streamActiveRidePage().map { page -> page.page.elements.any { it.dataTypeId == datatype } } }