summaryrefslogtreecommitdiff
path: root/src/gobang.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/gobang.go')
-rw-r--r--src/gobang.go58
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] {