func (r *Rule) AttrKeys() []string {
	keys := make([]string, 0, len(r.attrs))
	for k := range r.attrs {
		keys = append(keys, k)
	}
	sort.SliceStable(keys, func(i, j int) bool {
		if cmp := bt.NamePriority[keys[i]] - bt.NamePriority[keys[j]]; cmp != 0 {
			return cmp < 0
		}
		return keys[i] < keys[j]
	})
	return keys
}
func (r *Rule) AttrKeys() []string {
	keys := make([]string, 0, len(r.attrs))
	for k := range r.attrs {
		keys = append(keys, k)
	}
	sort.SliceStable(keys, func(i, j int) bool {
		if cmp := bt.NamePriority[keys[i]] - bt.NamePriority[keys[j]]; cmp != 0 {
			return cmp < 0
		}
		return keys[i] < keys[j]
	})
	return keys
}
func ( r * Rule ) AttrKeys ( ) [ ] string { keys := make ( [ ] string , 0 , len ( r . attrs ) ) for k := range r . attrs { keys = append ( keys , k ) } sort . SliceStable ( keys , func ( i , j int ) bool { if cmp := bt . NamePriority [ keys [ i ] ] - bt . NamePriority [ keys [ j ] ] ; cmp != 0 { return cmp < 0 } return keys [ i ] < keys [ j ] } ) return keys }
// AttrKeys returns a sorted list of attribute keys used in this rule.
AttrKeys returns a sorted list of attribute keys used in this rule .