From d147fc7579bf77bf6f3ace669c8ade68be89d1ca Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 21 Apr 2018 19:41:19 +0300 Subject: Improve tab completion system --- lib/util/lcp.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 lib/util/lcp.go (limited to 'lib') diff --git a/lib/util/lcp.go b/lib/util/lcp.go new file mode 100644 index 0000000..2e2e690 --- /dev/null +++ b/lib/util/lcp.go @@ -0,0 +1,38 @@ +// Licensed under the GNU Free Documentation License 1.2 +// https://www.gnu.org/licenses/old-licenses/fdl-1.2.en.html +// +// Source: https://rosettacode.org/wiki/Longest_common_prefix#Go + +package util + +func LongestCommonPrefix(list []string) string { + // Special cases first + switch len(list) { + case 0: + return "" + case 1: + return list[0] + } + + // LCP of min and max (lexigraphically) + // is the LCP of the whole set. + min, max := list[0], list[0] + for _, s := range list[1:] { + switch { + case s < min: + min = s + case s > max: + max = s + } + } + + for i := 0; i < len(min) && i < len(max); i++ { + if min[i] != max[i] { + return min[:i] + } + } + + // In the case where lengths are not equal but all bytes + // are equal, min is the answer ("foo" < "foobar"). + return min +} -- cgit v1.2.3