clone

fifteen puzzle games for the terminal, with daily puzzles, weekly ladders and xp, built on bubble tea

refactor/root-tui-model
puzzletea / app / spawn.go
spawn.go 2.0K
1package app23import (4 "context"5 "math/rand/v2"6 "time"78 "github.com/FelineStateMachine/puzzletea/difficulty"9 "github.com/FelineStateMachine/puzzletea/game"1011 tea "charm.land/bubbletea/v2"12)1314const spawnTimeout = 10 * time.Second1516type spawnCompleteMsg struct {17 jobID int6418 result game.SpawnCompleteMsg19}2021func spawnEloCmd(spawner game.EloSpawner, seed string, elo difficulty.Elo, ctx context.Context, jobID int64) tea.Cmd {22 return func() tea.Msg {23 var (24 g game.Gamer25 report difficulty.Report26 err error27 )28 if cancellable, ok := spawner.(game.CancellableEloSpawner); ok {29 g, report, err = cancellable.SpawnEloContext(ctx, seed, elo)30 } else {31 g, report, err = spawner.SpawnElo(seed, elo)32 }33 return spawnCompleteMsg{34 jobID: jobID,35 result: game.SpawnCompleteMsg{Game: g, Report: report, Err: err},36 }37 }38}3940// spawnCmd returns a tea.Cmd that runs Spawn() off the main goroutine.41func spawnCmd(spawner game.Spawner, ctx context.Context, jobID int64) tea.Cmd {42 return func() tea.Msg {43 var (44 g game.Gamer45 err error46 )47 if cancellable, ok := spawner.(game.CancellableSpawner); ok {48 g, err = cancellable.SpawnContext(ctx)49 } else {50 g, err = spawner.Spawn()51 }52 return spawnCompleteMsg{53 jobID: jobID,54 result: game.SpawnCompleteMsg{Game: g, Err: err},55 }56 }57}5859// spawnSeededCmd returns a tea.Cmd that runs SpawnSeeded() off the main goroutine.60// The caller must not use rng after this call — *rand.Rand is not goroutine-safe61// and ownership is transferred to the spawned goroutine.62func spawnSeededCmd(spawner game.SeededSpawner, rng *rand.Rand, ctx context.Context, jobID int64) tea.Cmd {63 return func() tea.Msg {64 var (65 g game.Gamer66 err error67 )68 if cancellable, ok := spawner.(game.CancellableSeededSpawner); ok {69 g, err = cancellable.SpawnSeededContext(ctx, rng)70 } else {71 g, err = spawner.SpawnSeeded(rng)72 }73 return spawnCompleteMsg{74 jobID: jobID,75 result: game.SpawnCompleteMsg{Game: g, Err: err},76 }77 }78}