From 5bcdd45b10e8b8cc4c1e516d785c250002ec0325 Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Fri, 9 Jan 2026 15:49:58 -0500 Subject: [PATCH] horsegen: load and generate in parallel --- go.mod | 5 ++- horsegen/main.go | 100 +++++++++++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/go.mod b/go.mod index b518953..98fd721 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/horsegen/main.go b/horsegen/main.go index ae32fbe..9a6d5ca 100644 --- a/horsegen/main.go +++ b/horsegen/main.go @@ -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") } }