galvas
02/05/2024, 10:08 AMgabfssilva
02/22/2024, 10:52 AMgalvas
02/22/2024, 2:59 PMgabfssilva
02/22/2024, 5:10 PMsuspend fun Flow<Int>.sum(): Int {
    var acc = 0
    collect { acc = acc + it }
    return acc
}collectsuspend fun <T> Flow<T>.last(): T {
    var last: T? = null
    collect { last = it }
    return checkNotNull(last)
}
suspend fun <T> Flow<T>.size(): Int {
    var size = 0
    collect { ++size }
    return size
}sealed class OrderMessage {
    object ProcessOrder : OrderMessage()
    data class UpdateOrderStatus(val newStatus: Status) : OrderMessage()
}
fun CoroutineScope.orderActor(initialOrder: Order) = actor<OrderMessage> {
    var order = initialOrder // the order itself is mutable
    for (msg in channel) {
        when (msg) {
            is OrderMessage.ProcessOrder -> {
                order = order.copy(status = Status.PROCESSING)
                println("Order ${order.id} is now ${order.status}")
                processOrder(channel) // passing the actor channel itself as reference
            }
            is OrderMessage.UpdateOrderStatus -> {
                order = order.copy(status = msg.newStatus)
                println("Order ${order.id} is now ${order.status}")
            }
        }
    }
}
suspend fun processOrder(callback: SendChannel<OrderMessage>) {
    val paymentProcessed = (1..2).random() == 1
    val newStatus = if (paymentProcessed) Status.PAID else Status.NOT_PAID
    launch { 
        delay(1000) // Simulate async processing
        callback.send(OrderMessage.UpdateOrderStatus(newStatus))
    } // Send message back to actor
}galvas
02/23/2024, 9:22 AMgalvas
02/23/2024, 9:24 AMchannel._consumeAsFlow_()