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)