@@ -44,7 +44,7 @@ struct DeferredFragmentsMetadataTemplate {
44
44
) -> TemplateString {
45
45
"""
46
46
enum DeferredFragmentIdentifiers {
47
- \( deferredFragmentPathTypeInfo. map {
47
+ \( deferredFragmentPathTypeInfo. unique ( by : { $0 . pathDeferConditionHash } ) . map {
48
48
return """
49
49
static let \( $0. deferCondition. label) = DeferredFragmentIdentifier(label: \" \( $0. deferCondition. label) \" , fieldPath: [ \
50
50
\( $0. path. map { " \" \( $0) \" " } , separator: " , " ) \
@@ -75,6 +75,22 @@ struct DeferredFragmentsMetadataTemplate {
75
75
let path : [ String ]
76
76
let deferCondition : CompilationResult . DeferCondition
77
77
let typeName : String
78
+
79
+ /// Provides a hash value that is a combination of `path` and `deferCondition` values only, `typeName` is not
80
+ /// included.
81
+ ///
82
+ /// This is intended to be used when the selection set type does not matter, such as when generating a deferred
83
+ /// fragment identifier which is shared amongst all child selection set types within a deferred fragment.
84
+ ///
85
+ /// - Returns: Hash value of `path` and `deferCondition`.
86
+ var pathDeferConditionHash : Int {
87
+ var hasher = Hasher ( )
88
+
89
+ hasher. combine ( path)
90
+ hasher. combine ( deferCondition)
91
+
92
+ return hasher. finalize ( )
93
+ }
78
94
}
79
95
80
96
fileprivate func DeferredFragmentsPathTypeInfo(
@@ -134,3 +150,10 @@ struct DeferredFragmentsMetadataTemplate {
134
150
return deferredPathTypeInfo
135
151
}
136
152
}
153
+
154
+ fileprivate extension Sequence where Element == DeferredFragmentsMetadataTemplate . DeferredPathTypeInfo {
155
+ func unique< T: Hashable > ( by keyForValue: ( Iterator . Element ) throws -> T ) rethrows -> [ Iterator . Element ] {
156
+ var seen : Set < T > = [ ]
157
+ return try filter { try seen. insert ( keyForValue ( $0) ) . inserted }
158
+ }
159
+ }
0 commit comments