You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

91 lines
1.7 KiB

package formattools
import (
"fmt"
"sort"
"strings"
)
func CompactMatch(ids []string) string {
if len(ids) == 1 {
return ids[0]
}
shortestPrefix := ids[0]
for _, curr := range ids[1:] {
minLength := len(shortestPrefix)
if len(curr) < minLength {
minLength = len(curr)
}
if len(shortestPrefix) > minLength {
shortestPrefix = shortestPrefix[:minLength]
}
for i := 0; i < minLength; i++ {
if curr[i] != shortestPrefix[i] {
shortestPrefix = curr[:i]
break
}
}
}
sb := strings.Builder{}
sb.WriteString(shortestPrefix)
sb.WriteByte('{')
for i, curr := range ids {
if i != 0 {
sb.WriteByte(',')
}
sb.WriteString(curr[len(shortestPrefix):])
}
sb.WriteByte('}')
return sb.String()
}
func CompactIDList(ids []string) []string {
ids = append(ids[:0:0], ids...)
sort.Strings(ids)
currentGroup := ""
currentIDs := make([]string, 0, len(ids))
groups := make([]string, 0, 2)
for _, id := range ids {
if id == "" {
continue
}
split := strings.SplitN(id, ":", 3)
if len(split) < 3 {
continue
}
group := id[:len(split[0])+len(split[1])+1]
if group != currentGroup {
if len(currentIDs) > 0 {
if len(currentIDs) == 1 {
groups = append(groups, fmt.Sprintf("%s:%s", currentGroup, currentIDs[0]))
} else {
groups = append(groups, fmt.Sprintf("%s:{%s}", currentGroup, strings.Join(currentIDs, ",")))
}
currentIDs = currentIDs[:0]
}
currentGroup = group
}
currentIDs = append(currentIDs, split[2])
}
if len(currentIDs) > 0 {
if len(currentIDs) == 1 {
groups = append(groups, fmt.Sprintf("%s:%s", currentGroup, currentIDs[0]))
} else {
groups = append(groups, fmt.Sprintf("%s:{%s}", currentGroup, strings.Join(currentIDs, ",")))
}
}
return groups
}