summaryrefslogtreecommitdiff
path: root/aoc/day.go
diff options
context:
space:
mode:
Diffstat (limited to 'aoc/day.go')
-rw-r--r--aoc/day.go46
1 files changed, 39 insertions, 7 deletions
diff --git a/aoc/day.go b/aoc/day.go
index 7505223..1258e46 100644
--- a/aoc/day.go
+++ b/aoc/day.go
@@ -3,17 +3,49 @@ package aoc
import (
"bufio"
"context"
+ "fmt"
+ "io"
+ "log"
+ "os"
)
-type Reader[T any] interface {
- Read(ctx context.Context, scanner *bufio.Scanner) (T, error)
+type ScanCloser struct {
+ *bufio.Scanner
+ io.Closer
}
-type Solver[T any, R any] interface {
- Solve(ctx context.Context, data T) (R, error)
+func NewScanCloser(file string) *ScanCloser {
+ f, err := os.Open(file)
+ if err != nil {
+ log.Panic(err)
+ }
+ return &ScanCloser{
+ Scanner: bufio.NewScanner(f),
+ Closer: f,
+ }
}
-func RunDay[T any, R any](ctx context.Context, in Reader[T], solvers ...Solver[T, R]) {
- ctx, cancel := context.WithCancel(ctx)
- defer cancel()
+type Solver[T any, R any] func(ctx context.Context, data T) (R, error)
+
+func RunDay[T any, R any](ctx context.Context, s *ScanCloser, in Reader[T], solvers ...Solver[T, R]) error {
+ defer s.Closer.Close()
+
+ data, err := in(ctx, s.Scanner)
+ if err != nil {
+ return err
+ }
+
+ results := make([]R, 0)
+ for _, solver := range solvers {
+ out, err := solver(ctx, data)
+ if err != nil {
+ return fmt.Errorf("")
+ }
+ results = append(results, out)
+ }
+
+ for _, result := range results {
+ fmt.Println(result)
+ }
+ return nil
}