horsegen: load and generate in parallel

This commit is contained in:
2026-01-09 15:49:58 -05:00
parent 96c6273419
commit 5bcdd45b10
2 changed files with 61 additions and 44 deletions

5
go.mod
View File

@@ -2,7 +2,10 @@ module git.sunturtle.xyz/zephyr/horse
go 1.24.1 go 1.24.1
require zombiezen.com/go/sqlite v1.4.2 require (
golang.org/x/sync v0.14.0
zombiezen.com/go/sqlite v1.4.2
)
require ( require (
github.com/dustin/go-humanize v1.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect

View File

@@ -8,6 +8,7 @@ import (
"os/signal" "os/signal"
"path/filepath" "path/filepath"
"golang.org/x/sync/errgroup"
"zombiezen.com/go/sqlite" "zombiezen.com/go/sqlite"
"zombiezen.com/go/sqlite/sqlitex" "zombiezen.com/go/sqlite/sqlitex"
) )
@@ -21,9 +22,9 @@ func main() {
flag.StringVar(&out, "kk", `.\horse`, "existing `dir`ectory for output Koka files") flag.StringVar(&out, "kk", `.\horse`, "existing `dir`ectory for output Koka files")
flag.Parse() flag.Parse()
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) pctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
go func() { go func() {
<-ctx.Done() <-pctx.Done()
stop() stop()
}() }()
@@ -40,49 +41,62 @@ func main() {
os.Exit(1) os.Exit(1)
} }
slog.Info("get characters") eg, ctx := errgroup.WithContext(pctx)
charas, err := Characters(ctx, db) var (
if err != nil { charas []NamedID[Character]
slog.Error("getting characters", slog.Any("err", err)) pairs []AffinityRelation
os.Exit(1) trios []AffinityRelation
} sg []NamedID[SkillGroup]
slog.Info("get pairs") )
pairs, err := CharacterPairs(ctx, db) eg.Go(func() error {
if err != nil { slog.Info("get characters")
slog.Error("getting pairs", slog.Any("err", err)) r, err := Characters(ctx, db)
os.Exit(1) charas = r
} return err
slog.Info("get trios") })
trios, err := CharacterTrios(ctx, db) eg.Go(func() error {
if err != nil { slog.Info("get pairs")
slog.Error("getting trios", slog.Any("err", err)) r, err := CharacterPairs(ctx, db)
os.Exit(1) pairs = r
} return err
slog.Info("get skill groups") })
sg, err := SkillGroups(ctx, db) eg.Go(func() error {
if err != nil { slog.Info("get trios")
slog.Error("getting skill groups", slog.Any("err", err)) r, err := CharacterTrios(ctx, db)
trios = r
return err
})
eg.Go(func() error {
slog.Info("get skill groups")
r, err := SkillGroups(ctx, db)
sg = r
return err
})
if err := eg.Wait(); err != nil {
slog.Error("load", slog.Any("err", err))
os.Exit(1) os.Exit(1)
} }
cf, err := os.Create(filepath.Join(out, "character.kk")) eg, ctx = errgroup.WithContext(pctx)
if err != nil { eg.Go(func() error {
slog.Error("creating character.kk", slog.Any("err", err)) cf, err := os.Create(filepath.Join(out, "character.kk"))
os.Exit(1) if err != nil {
} return err
slog.Info("write characters") }
if err := ExecCharacterKK(t, cf, charas, pairs, trios); err != nil { slog.Info("write characters")
slog.Error("writing character.kk", slog.Any("err", err)) return ExecCharacterKK(t, cf, charas, pairs, trios)
// continue on })
} eg.Go(func() error {
sf, err := os.Create(filepath.Join(out, "skill.kk")) sf, err := os.Create(filepath.Join(out, "skill.kk"))
if err != nil { if err != nil {
slog.Error("creating skill.kk", slog.Any("err", err)) return err
os.Exit(1) }
} slog.Info("write skills")
slog.Info("write skills") return ExecSkillKK(t, sf, sg)
if err := ExecSkillKK(t, sf, sg); err != nil { })
slog.Error("writing skill.kk", slog.Any("err", err)) if err := eg.Wait(); err != nil {
// continue on slog.Error("generate", slog.Any("err", err))
} else {
slog.Info("done")
} }
} }