// An order model in Kotlin: data classes, an enum, a sealed result type, // extension functions, and when expressions. enum class Status { PENDING, SHIPPED, DELIVERED } data class LineItem(val name: String, val qty: Int, val unitCents: Int) { val totalCents: Int get() = qty * unitCents } data class Order(val id: String, val status: Status, val items: List) sealed interface Result { data class Ok(val value: T) : Result data class Err(val message: String) : Result } fun Order.totalCents(): Int = items.sumOf { it.totalCents } fun Order.summary(): String = when (status) { Status.PENDING -> "Order $id is awaiting shipment" Status.SHIPPED -> "Order $id is on the way" Status.DELIVERED -> "Order $id was delivered" } fun checkout(order: Order): Result = if (order.items.isEmpty()) Result.Err("empty order") else Result.Ok(order.totalCents()) fun main() { val order = Order( id = "A-1001", status = Status.SHIPPED, items = listOf(LineItem("Notebook", 3, 450), LineItem("Pen", 10, 120)), ) println(order.summary()) when (val result = checkout(order)) { is Result.Ok -> println("total cents: ${result.value}") is Result.Err -> println("error: ${result.message}") } }