25 · Máquinas de Estado
Máquinas indexadas por estado
new_static cria uma máquina com ownership e testemunho do estado. send a consome e retorna o tipo do estado destino; uma falha de guard devolve a máquina e o evento originais. Funções podem exigir Order<.Paid>. erase_state devolve uma máquina dinâmica quando a checagem estática não é mais necessária.
Nesta página
new_static cria uma máquina com ownership e testemunho do estado. send a consome e retorna o tipo do estado destino; uma falha de guard devolve a máquina e o evento originais. Funções podem exigir Order<.Paid>. erase_state devolve uma máquina dinâmica quando a checagem estática não é mais necessária.
Exemplo completo
Máquinas indexadas por estado.
state_indexed_machines.zolo
machine Order {
state Draft, Paid, Shipped
event Pay, Ship
initial Draft
Draft -> Paid on Pay
Paid -> Shipped on Ship
}
fn ship(sink order: Order<.Paid>) -> Order<.Shipped> =
order.send(Order.Event.Ship)
let paid = Order.new_static().send(Order.Event.Pay)
let shipped = ship(sink paid)
let ordinary = shipped.erase_state()
match ordinary.state {
.Shipped => print("shipped"),
_ => assert(false)
}
// A guarded transition returns the original machine and event on failure.
machine Door {
state Closed, Open
event Unlock
initial Closed
Closed -> Open on Unlock if false
}
match Door.new_static().send(Door.Event.Unlock) {
.Ok(open) => { let ordinary = open.erase_state(); assert(false) },
.Err({ machine: closed, event: retry }) => {
let ordinary = closed.erase_state()
match retry { .Unlock => print("closed") }
}
}
Regras e comportamento
Estados e eventos tipados · Documentação
A partir de um checkout do repositório:
zolo examples/features/state_indexed_machines.zolo
Veja também