package com.ustadmobile.libcache.util import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.ChannelResult import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update /** * Receive any pending ready to consume items up to a limit of maxItems */ fun Channel.receivePending( maxItems: Int = Int.MAX_VALUE, backlogCount: MutableStateFlow?, ) : List { val list = mutableListOf() var itemCount = 0 do { val result = tryReceive() val item = result.getOrNull() item?.also { list.add(it) } } while (item != null && itemCount++ < maxItems) if(itemCount > 0) { backlogCount?.update { it - itemCount } } return list.toList() } fun Channel.trySendAndUpdateBacklogSize( element: T, backlogCount: MutableStateFlow ) : ChannelResult { return trySend(element).also { result -> if(result.isSuccess) { backlogCount.update { it + 1 } } } } suspend fun Channel.sendAndUpdateBacklogSize( element: T, backlogCount: MutableStateFlow ) { backlogCount.update { it + 1 } send(element) } suspend fun Channel.receiveAndUpdateBacklogSize( backlogCount: MutableStateFlow ) : T { val item = receive() backlogCount.update { it - 1 } return item }