2015-07-26 20:04:03 +00:00
|
|
|
package backend
|
|
|
|
|
2015-08-08 15:03:13 +00:00
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
2015-07-26 20:04:03 +00:00
|
|
|
// IDs is an ordered list of IDs that implements sort.Interface.
|
|
|
|
type IDs []ID
|
|
|
|
|
|
|
|
func (ids IDs) Len() int {
|
|
|
|
return len(ids)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ids IDs) Less(i, j int) bool {
|
|
|
|
if len(ids[i]) < len(ids[j]) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, b := range ids[i] {
|
|
|
|
if b == ids[j][k] {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if b < ids[j][k] {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ids IDs) Swap(i, j int) {
|
|
|
|
ids[i], ids[j] = ids[j], ids[i]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Uniq returns list without duplicate IDs. The returned list retains the order
|
|
|
|
// of the original list so that the order of the first occurrence of each ID
|
|
|
|
// stays the same.
|
|
|
|
func (ids IDs) Uniq() (list IDs) {
|
|
|
|
seen := NewIDSet()
|
|
|
|
|
|
|
|
for _, id := range ids {
|
|
|
|
if seen.Has(id) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
list = append(list, id)
|
|
|
|
seen.Insert(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
return list
|
|
|
|
}
|
2015-08-08 15:03:13 +00:00
|
|
|
|
|
|
|
type shortID ID
|
|
|
|
|
|
|
|
func (id shortID) String() string {
|
|
|
|
return hex.EncodeToString(id[:shortStr])
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ids IDs) String() string {
|
|
|
|
elements := make([]shortID, 0, len(ids))
|
|
|
|
for _, id := range ids {
|
|
|
|
elements = append(elements, shortID(id))
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("%v", elements)
|
|
|
|
}
|