blob: dc93731e91783a020cbb464eaee29ef5f2f9e9f9 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package foreach provides allocation-conscious helpers
// for iterating over lines of text.
//
// They're factored out into a separate small package primarily
// to allow them to have allocation-measuring tests that need
// to run without interference from other goroutine-leaking tests.
package foreach
import (
"bytes"
"strings"
)
// Line calls f on each line in v, without the trailing '\n'.
// The final line need not include a trailing '\n'.
// Returns first non-nil error returned by f.
func Line(v []byte, f func([]byte) error) error {
for len(v) > 0 {
i := bytes.IndexByte(v, '\n')
if i < 0 {
return f(v)
}
if err := f(v[:i]); err != nil {
return err
}
v = v[i+1:]
}
return nil
}
// LineStr calls f on each line in s, without the trailing '\n'.
// The final line need not include a trailing '\n'.
// Returns first non-nil error returned by f.
//
// LineStr is the string variant of Line.
func LineStr(s string, f func(string) error) error {
for len(s) > 0 {
i := strings.IndexByte(s, '\n')
if i < 0 {
return f(s)
}
if err := f(s[:i]); err != nil {
return err
}
s = s[i+1:]
}
return nil
}