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
require zombiezen.com/go/sqlite v1.4.2
require (
golang.org/x/sync v0.14.0
zombiezen.com/go/sqlite v1.4.2
)
require (
github.com/dustin/go-humanize v1.0.1 // indirect

View File

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