forked from mirror/enumer
48 lines
983 B
Go
48 lines
983 B
Go
|
package main
|
||
|
|
||
|
import "strings"
|
||
|
|
||
|
func longestCommonPrefix(values []Value) string {
|
||
|
// LCP of min and max (lexigraphically)
|
||
|
// is the LCP of the whole set.
|
||
|
min := values[0].name
|
||
|
max := min
|
||
|
for _, s := range values[1:] {
|
||
|
switch {
|
||
|
case s.name < min:
|
||
|
min = s.name
|
||
|
case s.name > max:
|
||
|
max = s.name
|
||
|
}
|
||
|
}
|
||
|
for i := 0; i < len(min) && i < len(max); i++ {
|
||
|
if min[i] != max[i] {
|
||
|
return min[:i]
|
||
|
}
|
||
|
}
|
||
|
// If all the bytes are equal but the lengths aren't then
|
||
|
// min is a prefix of max, and hence the lcp
|
||
|
return min
|
||
|
}
|
||
|
|
||
|
func autoPrefix(values []Value) string {
|
||
|
// Can't trim a single value
|
||
|
if len(values) < 2 {
|
||
|
return ""
|
||
|
}
|
||
|
prefix := longestCommonPrefix(values)
|
||
|
|
||
|
return prefix
|
||
|
}
|
||
|
|
||
|
func (g *Generator) trimValueNames(values []Value, prefix string) {
|
||
|
for i := range values {
|
||
|
values[i].name = strings.TrimPrefix(values[i].name, prefix)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (g *Generator) autoTrimValueNames(values []Value) {
|
||
|
prefix := autoPrefix(values)
|
||
|
g.trimValueNames(values, prefix)
|
||
|
}
|