package bytesutil import ( "bytes" "sort" ) // Sort sorts a slice of byte slices. func Sort(a [][]byte) { sort.Sort(byteSlices(a)) } func IsSorted(a [][]byte) bool { return sort.IsSorted(byteSlices(a)) } func SearchBytes(a [][]byte, x []byte) int { return sort.Search(len(a), func(i int) bool { return bytes.Compare(a[i], x) >= 0 }) } // Union returns the union of a & b in sorted order. func Union(a, b [][]byte) [][]byte { n := len(b) if len(a) > len(b) { n = len(a) } other := make([][]byte, 0, n) for { if len(a) > 0 && len(b) > 0 { if cmp := bytes.Compare(a[0], b[0]); cmp == 0 { other, a, b = append(other, a[0]), a[1:], b[1:] } else if cmp == -1 { other, a = append(other, a[0]), a[1:] } else { other, b = append(other, b[0]), b[1:] } } else if len(a) > 0 { other, a = append(other, a[0]), a[1:] } else if len(b) > 0 { other, b = append(other, b[0]), b[1:] } else { return other } } } // Intersect returns the intersection of a & b in sorted order. func Intersect(a, b [][]byte) [][]byte { n := len(b) if len(a) > len(b) { n = len(a) } other := make([][]byte, 0, n) for len(a) > 0 && len(b) > 0 { if cmp := bytes.Compare(a[0], b[0]); cmp == 0 { other, a, b = append(other, a[0]), a[1:], b[1:] } else if cmp == -1 { a = a[1:] } else { b = b[1:] } } return other } type byteSlices [][]byte func (a byteSlices) Len() int { return len(a) } func (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 } func (a byteSlices) Swap(i, j int) { a[i], a[j] = a[j], a[i] }