diff options
Diffstat (limited to 'aoc/day.go')
| -rw-r--r-- | aoc/day.go | 46 |
1 files changed, 39 insertions, 7 deletions
@@ -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 } |
