aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/jpillora/longestcommon/lc.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/jpillora/longestcommon/lc.go')
-rw-r--r--vendor/github.com/jpillora/longestcommon/lc.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/vendor/github.com/jpillora/longestcommon/lc.go b/vendor/github.com/jpillora/longestcommon/lc.go
new file mode 100644
index 0000000..788a7a6
--- /dev/null
+++ b/vendor/github.com/jpillora/longestcommon/lc.go
@@ -0,0 +1,82 @@
+package longestcommon
+
+import "strings"
+
+//TrimPrefix removes the longest common prefix from all provided strings
+func TrimPrefix(strs []string) {
+ p := Prefix(strs)
+ if p == "" {
+ return
+ }
+ for i, s := range strs {
+ strs[i] = strings.TrimPrefix(s, p)
+ }
+}
+
+//TrimSuffix removes the longest common suffix from all provided strings
+func TrimSuffix(strs []string) {
+ p := Suffix(strs)
+ if p == "" {
+ return
+ }
+ for i, s := range strs {
+ strs[i] = strings.TrimSuffix(s, p)
+ }
+}
+
+//Prefix returns the longest common prefix of the provided strings
+func Prefix(strs []string) string {
+ return longestCommonXfix(strs, true)
+}
+
+//Suffix returns the longest common suffix of the provided strings
+func Suffix(strs []string) string {
+ return longestCommonXfix(strs, false)
+}
+
+func longestCommonXfix(strs []string, pre bool) string {
+ //short-circuit empty list
+ if len(strs) == 0 {
+ return ""
+ }
+ xfix := strs[0]
+ //short-circuit single-element list
+ if len(strs) == 1 {
+ return xfix
+ }
+ //compare first to rest
+ for _, str := range strs[1:] {
+ xfixl := len(xfix)
+ strl := len(str)
+ //short-circuit empty strings
+ if xfixl == 0 || strl == 0 {
+ return ""
+ }
+ //maximum possible length
+ maxl := xfixl
+ if strl < maxl {
+ maxl = strl
+ }
+ //compare letters
+ if pre {
+ //prefix, iterate left to right
+ for i := 0; i < maxl; i++ {
+ if xfix[i] != str[i] {
+ xfix = xfix[:i]
+ break
+ }
+ }
+ } else {
+ //suffix, iternate right to left
+ for i := 0; i < maxl; i++ {
+ xi := xfixl - i - 1
+ si := strl - i - 1
+ if xfix[xi] != str[si] {
+ xfix = xfix[xi+1:]
+ break
+ }
+ }
+ }
+ }
+ return xfix
+}