Optimize mappings
diff --git a/ast/compare.go b/ast/compare.go
index fec22b1..617e8f0 100644
--- a/ast/compare.go
+++ b/ast/compare.go
@@ -21,7 +21,8 @@
n1.Key == n2.Key &&
n1.Layer == n2.Layer &&
n1.Match == n2.Match &&
- n1.Value == n2.Value
+ n1.Value == n2.Value &&
+ rewritesEqual(n1.Rewrites, n2.Rewrites)
}
case *TermGroup:
if n2, ok := b.(*TermGroup); ok {
@@ -33,22 +34,62 @@
return false
}
}
- return true
+ return rewritesEqual(n1.Rewrites, n2.Rewrites)
}
case *Token:
if n2, ok := b.(*Token); ok {
- return NodesEqual(n1.Wrap, n2.Wrap)
+ return NodesEqual(n1.Wrap, n2.Wrap) &&
+ rewritesEqual(n1.Rewrites, n2.Rewrites)
}
case *CatchallNode:
if n2, ok := b.(*CatchallNode); ok {
- return n1.NodeType == n2.NodeType &&
- reflect.DeepEqual(n1.RawContent, n2.RawContent) &&
- NodesEqual(n1.Wrap, n2.Wrap)
+ if n1.NodeType != n2.NodeType ||
+ !reflect.DeepEqual(n1.RawContent, n2.RawContent) ||
+ !NodesEqual(n1.Wrap, n2.Wrap) {
+ return false
+ }
+ // Compare operands
+ if len(n1.Operands) != len(n2.Operands) {
+ return false
+ }
+ for i := range n1.Operands {
+ if !NodesEqual(n1.Operands[i], n2.Operands[i]) {
+ return false
+ }
+ }
+ return true
+ }
+ case *Rewrite:
+ if n2, ok := b.(*Rewrite); ok {
+ return n1.Editor == n2.Editor &&
+ n1.Operation == n2.Operation &&
+ n1.Scope == n2.Scope &&
+ n1.Src == n2.Src &&
+ n1.Comment == n2.Comment &&
+ reflect.DeepEqual(n1.Original, n2.Original)
}
}
return false
}
+// rewritesEqual compares two slices of Rewrite structs for equality
+func rewritesEqual(a, b []Rewrite) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i := range a {
+ if a[i].Editor != b[i].Editor ||
+ a[i].Operation != b[i].Operation ||
+ a[i].Scope != b[i].Scope ||
+ a[i].Src != b[i].Src ||
+ a[i].Comment != b[i].Comment ||
+ !reflect.DeepEqual(a[i].Original, b[i].Original) {
+ return false
+ }
+ }
+ return true
+}
+
// IsTermNode checks if a node is a Term node
func IsTermNode(node Node) bool {
_, ok := node.(*Term)