diff options
Diffstat (limited to 'src/gobang.go')
-rw-r--r-- | src/gobang.go | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/gobang.go b/src/gobang.go index 3c705b7..88b4c57 100644 --- a/src/gobang.go +++ b/src/gobang.go @@ -76,8 +76,64 @@ var ( +func countLeadingChar(s string, c byte) int { + n := 0 + for { + if len(s) == n { + return n + } + + if s[n] == c { + n++ + continue + } else { + return n + } + } +} + +func countLeadingTabs(s string) int { + return countLeadingChar(s, '\t') +} + +func notEmptyString(s string) bool { + return len(s) > 0 +} + func Heredoc(s string) string { - return strings.Trim(strings.ReplaceAll(s, "\t", ""), "\n") + "\n" + lines := strings.Split(s, "\n") + if lines[0] == "" { + lines = lines[1:] + } + length := len(lines) + if length > 0 && lines[length - 1] == "" { + lines = lines[:length - 1] + } + if len(lines) == 0 { + lines = append(lines, "") + } + last := lines[len(lines) - 1] + if len(last) > 0 && countLeadingTabs(last) == len(last) { + lines = lines[:len(lines) - 1] + } + if len(lines) == 0 { + lines = append(lines, "") + } + + countableLines := Map(countLeadingTabs, Filter(notEmptyString, lines)) + if len(countableLines) == 0 { + countableLines = append(countableLines, 0) + } + minIndentation := slices.Min(countableLines) + trimmedLines := Map(func(s string) string { + if len(s) == 0 { + return s + } else { + return s[minIndentation:] + } + }, lines) + return strings.Join(trimmedLines, "\n") + "\n" + } func SetOf[T comparable](values ...T) SetT[T] { |