49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package westworldwithwoman
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"sync"
|
|
)
|
|
|
|
// doHousework is Elsa's everyday default state - the singleton
|
|
// pattern is the same one used throughout this package.
|
|
type doHousework struct{}
|
|
|
|
var (
|
|
doHouseworkInstance *doHousework
|
|
doHouseworkOnce sync.Once
|
|
)
|
|
|
|
// DoHousework is the Go stand-in for "DoHousework::Instance()".
|
|
func DoHousework() *doHousework {
|
|
doHouseworkOnce.Do(func() {
|
|
doHouseworkInstance = &doHousework{}
|
|
})
|
|
return doHouseworkInstance
|
|
}
|
|
|
|
var _ State[Elsa] = (*doHousework)(nil)
|
|
|
|
// chores is our own small stand-in for the book's actual chore list
|
|
// - it only ever showed two examples in its sample output ("Moppin'
|
|
// the floor", "Makin' the bed"), so that's exactly what's reused
|
|
// here. One gets picked at random each tick.
|
|
var chores = []string{
|
|
"Moppin' the floor",
|
|
"Makin' the bed",
|
|
}
|
|
|
|
// Enter does nothing - the book's sample output never shows a
|
|
// message when Elsa starts doing housework, only while she's doing
|
|
// it (Execute) and when she leaves the bathroom back into it.
|
|
func (s *doHousework) Enter(e *Elsa) {}
|
|
|
|
// Execute announces one randomly chosen chore per tick.
|
|
func (s *doHousework) Execute(e *Elsa) {
|
|
fmt.Printf("\n%s: %s", GetNameOfEntity(e.ID()), chores[rand.Intn(len(chores))])
|
|
}
|
|
|
|
// Exit does nothing, for the same reason as Enter.
|
|
func (s *doHousework) Exit(e *Elsa) {}
|