A transition function makes the rules for moving between model states easy to test.

State Transitions

state_transitions.go
package main

import "fmt"

const (
	OrderNew = iota
	OrderPaid
	OrderShipped
)

func nextState(current int, paid bool) int {
	if current == OrderNew && paid {
		return OrderPaid
	}
	if current == OrderPaid {
		return OrderShipped
	}
	return current
}

func main() {
	var paid = 
	current := OrderNew
	next := nextState(current, paid)
	done := next == OrderShipped

	fmt.Println("paid=", paid)
	fmt.Println("current=", current)
	fmt.Println("next=", next)
	fmt.Println("done=", done)
}
package main

import "fmt"

const (
	OrderNew = iota
	OrderPaid
	OrderShipped
)

func nextState(current int, paid bool) int {
	if current == OrderNew && paid {
		return OrderPaid
	}
	if current == OrderPaid {
		return OrderShipped
	}
	return current
}

func main() {
	var paid = 
	current := OrderNew
	next := nextState(current, paid)
	done := next == OrderShipped

	fmt.Println("paid=", paid)
	fmt.Println("current=", current)
	fmt.Println("next=", next)
	fmt.Println("done=", done)
}
transition function Keep state changes in one helper so each branch explains when the model can advance.