| | |
| | |
| | |
| |
|
| | package strings |
| |
|
| | import ( |
| | "iter" |
| | "unicode" |
| | "unicode/utf8" |
| | ) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | func Lines(s string) iter.Seq[string] { |
| | return func(yield func(string) bool) { |
| | for len(s) > 0 { |
| | var line string |
| | if i := IndexByte(s, '\n'); i >= 0 { |
| | line, s = s[:i+1], s[i+1:] |
| | } else { |
| | line, s = s, "" |
| | } |
| | if !yield(line) { |
| | return |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | func splitSeq(s, sep string, sepSave int) iter.Seq[string] { |
| | return func(yield func(string) bool) { |
| | if len(sep) == 0 { |
| | for len(s) > 0 { |
| | _, size := utf8.DecodeRuneInString(s) |
| | if !yield(s[:size]) { |
| | return |
| | } |
| | s = s[size:] |
| | } |
| | return |
| | } |
| | for { |
| | i := Index(s, sep) |
| | if i < 0 { |
| | break |
| | } |
| | frag := s[:i+sepSave] |
| | if !yield(frag) { |
| | return |
| | } |
| | s = s[i+len(sep):] |
| | } |
| | yield(s) |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | func SplitSeq(s, sep string) iter.Seq[string] { |
| | return splitSeq(s, sep, 0) |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | func SplitAfterSeq(s, sep string) iter.Seq[string] { |
| | return splitSeq(s, sep, len(sep)) |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | func FieldsSeq(s string) iter.Seq[string] { |
| | return func(yield func(string) bool) { |
| | start := -1 |
| | for i := 0; i < len(s); { |
| | size := 1 |
| | r := rune(s[i]) |
| | isSpace := asciiSpace[s[i]] != 0 |
| | if r >= utf8.RuneSelf { |
| | r, size = utf8.DecodeRuneInString(s[i:]) |
| | isSpace = unicode.IsSpace(r) |
| | } |
| | if isSpace { |
| | if start >= 0 { |
| | if !yield(s[start:i]) { |
| | return |
| | } |
| | start = -1 |
| | } |
| | } else if start < 0 { |
| | start = i |
| | } |
| | i += size |
| | } |
| | if start >= 0 { |
| | yield(s[start:]) |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | func FieldsFuncSeq(s string, f func(rune) bool) iter.Seq[string] { |
| | return func(yield func(string) bool) { |
| | start := -1 |
| | for i := 0; i < len(s); { |
| | r, size := utf8.DecodeRuneInString(s[i:]) |
| | if f(r) { |
| | if start >= 0 { |
| | if !yield(s[start:i]) { |
| | return |
| | } |
| | start = -1 |
| | } |
| | } else if start < 0 { |
| | start = i |
| | } |
| | i += size |
| | } |
| | if start >= 0 { |
| | yield(s[start:]) |
| | } |
| | } |
| | } |
| |
|