Durable by default
Each message commits the actor’s new state, its outgoing messages and its journal together, or not at all.
type Msg = | Deposit Int | Balance (Reply Int)
actor Account (id: String) receives Msg state balance = 0 on Deposit n = become { balance = balance + n } on Balance r = send r balance
fn main () = let account = Account "acc-1" send account (Deposit 50) let balance = ask account Balance print "balance: {balance}"balance: 50Run it twice: the balance is 50, then 100. The actor’s state is kept, every message is committed once, and a crash in the middle loses nothing.
Durable by default
Each message commits the actor’s new state, its outgoing messages and its journal together, or not at all.
Effects in the types
What a function does, from printing to calling a model, is part of its type, and handled where you choose.
Test the failures
A deterministic simulator explores crashes, delays and orderings; replay checks any actor’s history.
From one node to many
The same program runs on SQLite, on a cluster over rqlite or PostgreSQL, and upgrades while it runs.