From 1477c58dce415ed1b5bec83e10e13f72b33084c4 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 6 Dec 2025 12:31:00 -0600 Subject: [PATCH] feat: implement method for reading file line at a time --- cmd/01/main.go | 4 +-- cmd/03/main.go | 2 +- internal/file/file.go | 27 +++++++++++++++--- internal/file/file_test.go | 56 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 80 insertions(+), 9 deletions(-) diff --git a/cmd/01/main.go b/cmd/01/main.go index d064824..b826b0a 100644 --- a/cmd/01/main.go +++ b/cmd/01/main.go @@ -7,7 +7,7 @@ import ( ) func SolvePartOne(filePath string) int { - lines := file.ReadLines(filePath) + lines := file.ReadAllLines(filePath) dial := dial.New() total := 0 @@ -28,7 +28,7 @@ func SolvePartOne(filePath string) int { } func SolvePartTwo(filePath string) int { - lines := file.ReadLines(filePath) + lines := file.ReadAllLines(filePath) dial := dial.New() for _, line := range lines { diff --git a/cmd/03/main.go b/cmd/03/main.go index ae793fe..2b0c728 100644 --- a/cmd/03/main.go +++ b/cmd/03/main.go @@ -6,7 +6,7 @@ import ( ) func Solve(filePath string, numOfCells int) int64 { - input := file.ReadLines(filePath) + input := file.ReadAllLines(filePath) total := int64(0) for _, line := range input { diff --git a/internal/file/file.go b/internal/file/file.go index b0772a3..0ceb692 100644 --- a/internal/file/file.go +++ b/internal/file/file.go @@ -3,13 +3,32 @@ package file import ( "bufio" + "iter" "os" ) -// TODO: Implement a StreamLines method -// in the file package +func ReadLines(filePath string) iter.Seq[string] { + return func(yield func(string) bool) { + file, err := os.Open(filePath) -func ReadLines(filePath string) []string { + if err != nil { + yield("") + return + } + + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + if !yield(scanner.Text()) { + return + } + } + } +} + +func ReadAllLines(filePath string) []string { lines := []string{} file, openErr := os.Open(filePath) @@ -20,7 +39,7 @@ func ReadLines(filePath string) []string { scanner := bufio.NewScanner(file) - for hasLine := scanner.Scan(); hasLine; hasLine = scanner.Scan() { + for scanner.Scan() { line := scanner.Text() lines = append(lines, line) } diff --git a/internal/file/file_test.go b/internal/file/file_test.go index c81b82a..a032388 100644 --- a/internal/file/file_test.go +++ b/internal/file/file_test.go @@ -7,13 +7,13 @@ import ( "github.com/StevanFreeborn/advent-of-code-2025/internal/file" ) -func TestReadLines(t *testing.T) { +func TestAllReadLines(t *testing.T) { expectedLines := []string{ "hello", "world", } - result := file.ReadLines("test.txt") + result := file.ReadAllLines("test.txt") if slices.Equal(result, expectedLines) == false { t.Errorf("got %s but expected %s", result, expectedLines) @@ -29,3 +29,55 @@ func TestReadAllText(t *testing.T) { t.Errorf("got %q but expected %q", result, expectedText) } } + +func TestReadLines(t *testing.T) { + t.Run("it should return an empty line if the file does not exist", func(t *testing.T) { + expectedLines := []string{""} + lines := []string{} + + for line := range file.ReadLines("non-existent-file.txt") { + lines = append(lines, line) + } + + if slices.Equal(lines, expectedLines) == false { + t.Errorf("got %s but expected %s", lines, expectedLines) + } + }) + + t.Run("it should read all lines from the file", func(t *testing.T) { + expectedLines := []string{ + "hello", + "world", + } + + lines := []string{} + + for line := range file.ReadLines("test.txt") { + lines = append(lines, line) + } + + if slices.Equal(lines, expectedLines) == false { + t.Errorf("got %s but expected %s", lines, expectedLines) + } + }) + + t.Run("it should stop reading lines when iteration is stopped", func(t *testing.T) { + expectedLines := []string{ + "hello", + } + + lines := []string{} + + for line := range file.ReadLines("test.txt") { + if len(lines) >= 1 { + break + } + + lines = append(lines, line) + } + + if slices.Equal(lines, expectedLines) == false { + t.Errorf("got %s but expected %s", lines, expectedLines) + } + }) +}