@@ -111,6 +111,7 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
111111 elementIndent: Int ,
112112 elementSeparator: String ,
113113 collapseUnchanged: Bool ,
114+ hideUnchanged: Bool = false ,
114115 filter isIncluded: ( Mirror . Child ) -> Bool = { _ in true } ,
115116 areEquivalent: ( Mirror . Child , Mirror . Child ) -> Bool = { $0. label == $1. label } ,
116117 areInIncreasingOrder: ( ( Mirror . Child , Mirror . Child ) -> Bool ) ? = nil ,
@@ -220,6 +221,11 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
220221
221222 func flushUnchanged( ) {
222223 guard collapseUnchanged else { return }
224+ // When the caller opted into silent-discard mode, drop without printing.
225+ if hideUnchanged {
226+ unchangedBuffer. removeAll ( )
227+ return
228+ }
223229 if areInIncreasingOrder == nil && unchangedBuffer. count == 1 {
224230 let child = unchangedBuffer [ 0 ]
225231 print (
@@ -390,7 +396,8 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
390396 suffix: " ) " ,
391397 elementIndent: 2 ,
392398 elementSeparator: " , " ,
393- collapseUnchanged: false ,
399+ collapseUnchanged: format. hideUnchangedChildren,
400+ hideUnchanged: format. hideUnchangedChildren,
394401 filter: macroPropertyFilter ( for: lhs)
395402 )
396403 tracker. visitedItems. insert ( lhsItem)
@@ -426,7 +433,8 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
426433 suffix: " ) " ,
427434 elementIndent: 2 ,
428435 elementSeparator: " , " ,
429- collapseUnchanged: false ,
436+ collapseUnchanged: format. hideUnchangedChildren,
437+ hideUnchanged: format. hideUnchangedChildren,
430438 filter: macroPropertyFilter ( for: lhs)
431439 )
432440 } else {
@@ -599,7 +607,8 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
599607 suffix: " ) " ,
600608 elementIndent: 2 ,
601609 elementSeparator: " , " ,
602- collapseUnchanged: false ,
610+ collapseUnchanged: format. hideUnchangedChildren,
611+ hideUnchanged: format. hideUnchangedChildren,
603612 map: { child, _ in
604613 if child. label? . first == " . " {
605614 child. label = nil
@@ -671,7 +680,8 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
671680 suffix: " ) " ,
672681 elementIndent: 2 ,
673682 elementSeparator: " , " ,
674- collapseUnchanged: false ,
683+ collapseUnchanged: format. hideUnchangedChildren,
684+ hideUnchanged: format. hideUnchangedChildren,
675685 filter: macroPropertyFilter ( for: lhs)
676686 )
677687
@@ -683,7 +693,8 @@ public func diff<T>(_ lhs: T, _ rhs: T, format: DiffFormat = .default) -> String
683693 suffix: " ) " ,
684694 elementIndent: 2 ,
685695 elementSeparator: " , " ,
686- collapseUnchanged: false ,
696+ collapseUnchanged: format. hideUnchangedChildren,
697+ hideUnchanged: format. hideUnchangedChildren,
687698 map: { child, _ in
688699 if child. label? . first == " . " {
689700 child. label = nil
@@ -766,14 +777,21 @@ public struct DiffFormat: Sendable {
766777 /// something "unchanged."
767778 public var both : String
768779
780+ /// When `true`, unchanged children of struct, class, tuple, enum, and `_CustomDiffObject` types
781+ /// are silently omitted from the diff output, while the parent container name is still shown.
782+ /// Collection, dictionary, set, and multi-line string diffs are unaffected.
783+ public var hideUnchangedChildren : Bool
784+
769785 public init (
770786 first: String ,
771787 second: String ,
772- both: String
788+ both: String ,
789+ hideUnchangedChildren: Bool = false
773790 ) {
774791 self . first = first
775792 self . second = second
776793 self . both = both
794+ self . hideUnchangedChildren = hideUnchangedChildren
777795 }
778796
779797 /// The default format for ``diff(_:_:format:)`` output, appropriate for where monospaced fonts
@@ -790,6 +808,10 @@ public struct DiffFormat: Sendable {
790808 /// figure space (" ") for unchanged. These three characters are more likely to render with equal
791809 /// widths in proportional fonts.
792810 public static let proportional = Self ( first: " \u{2212} " , second: " + " , both: " \u{2007} " )
811+
812+ /// A compact diff format that hides unchanged properties, showing only changed ones with parent
813+ /// context. Useful for deep or wide types to reduce noise when only a few fields change.
814+ public static let compact = Self ( first: " - " , second: " + " , both: " " , hideUnchangedChildren: true )
793815}
794816
795817private struct Line : CustomDumpStringConvertible , Identifiable {
0 commit comments