Today we’re cooking the perfect Use Case — and CQRS will be our recipe. Ingredients Action — fire and forget (logout, clear cache) Query — read data (list products) Command — write data (update profile) Exchange — transform data (login) All four types extend a sealed interface: sealed interface UseCase < Input , Output > { class Action : UseCase < Unit , Unit > class Query < Output > : UseCase < Unit , Output > class Command < Input > : UseCase < Input , Unit > class Exchange < Input , Output > : UseCase < Input , Output > } Enter fullscreen mode Exit fullscreen mode Three Ways to Season It Arrow (Typed Errors) — the chef’s choice: class GenerateSeed ( private val seedService : SeedService ) : UseCase . Action { override suspend fun Raise < Throwable >. action () = seedService . generateSeed ().…