summaryrefslogtreecommitdiff
path: root/aoc/day.go
blob: b47607b39c59c6eb9428eb1688a99325bee8b679 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package aoc

import (
	"bufio"
	"context"
	"fmt"
	"io"
	"log"
	"os"
)

type ScanCloser struct {
	*bufio.Scanner
	io.Closer
}

func NewScanCloser(file string) *ScanCloser {
	f, err := os.Open(file)
	if err != nil {
		log.Panic(err)
	}
	return &ScanCloser{
		Scanner: bufio.NewScanner(f),
		Closer:  f,
	}
}

type Solvers[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 Solvers[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
}