feat: finalize with step 5
This commit is contained in:
1 parent
129dd5d8b8
commit
aab128b55c
10 files changed
+332
-37
No files matched your search
@@ -0,0 +1,62 @@
|
||||
package westworldwithmessaging
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// eatStew is the Go version of the (not yet pasted) singleton class
|
||||
// EatStew from the book. Same pattern as every other state:
|
||||
// unexported type, one shared instance, reached only through the
|
||||
// function below.
|
||||
type eatStew struct{}
|
||||
|
||||
var (
|
||||
eatStewInstance *eatStew
|
||||
eatStewOnce sync.Once
|
||||
)
|
||||
|
||||
// EatStew is the Go stand-in for "EatStew::Instance()".
|
||||
func EatStew() *eatStew {
|
||||
eatStewOnce.Do(func() {
|
||||
eatStewInstance = &eatStew{}
|
||||
})
|
||||
return eatStewInstance
|
||||
}
|
||||
|
||||
var _ State[Miner] = (*eatStew)(nil)
|
||||
|
||||
// The book never pasted this state's actual source - it only ever
|
||||
// referenced EatStew::Instance() as a switch target. This whole
|
||||
// implementation is reverse-engineered from a sample run of the
|
||||
// finished program, which shows this exact sequence: Bob enters
|
||||
// (one line), eats (one line, then immediately heads back to
|
||||
// whatever he was doing - a single-tick state, same shape as
|
||||
// QuenchThirst), and leaving prints one more line before he's back
|
||||
// in GoHomeAndSleepTilRested.
|
||||
|
||||
// Enter announces that dinner smells good.
|
||||
func (s *eatStew) Enter(m *Miner) {
|
||||
fmt.Printf("\n%s: Smells reaaal goood, Elsa!", GetNameOfEntity(m.ID()))
|
||||
}
|
||||
|
||||
// Execute is the entire meal: announce it, then head back to
|
||||
// whatever state he was in before dinner interrupted him. The sample
|
||||
// output never shows more than one "Tastes real good too!" line, so
|
||||
// - like QuenchThirst - this doesn't loop across multiple ticks.
|
||||
func (s *eatStew) Execute(m *Miner) {
|
||||
fmt.Printf("\n%s: Tastes real good too!", GetNameOfEntity(m.ID()))
|
||||
m.ChangeState(GoHomeAndSleepTilRested())
|
||||
}
|
||||
|
||||
// Exit thanks Elsa for the meal on the way out.
|
||||
func (s *eatStew) Exit(m *Miner) {
|
||||
fmt.Printf("\n%s: Thank ya li'l lady. Ah better get back to whatever ah wuz doin'", GetNameOfEntity(m.ID()))
|
||||
}
|
||||
|
||||
// OnMessage is required now that State[T] includes it. The sample
|
||||
// output doesn't show Bob reacting to any message while eating, so
|
||||
// false ("not handled") is the correct default.
|
||||
func (s *eatStew) OnMessage(m *Miner, msg Telegram) bool {
|
||||
return false
|
||||
}
|
||||
Reference in new issue
Block a user