11// TODO: Figure out a destructuring implementation that uses variadic generics (tricky without same type requirements)
2+ /// Destructures the given `elements` into a tuple of 0 elements if there are exactly 0 elements.
23public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( ) ? {
34 let array = Array ( elements)
45 guard array. count == 0 else {
@@ -8,6 +9,7 @@ public func destructure<Element>(_ elements: some Sequence<Element>) -> ()? {
89}
910
1011/// Destructures the given `elements` into a single element if there is exactly one element.
12+ ///
1113/// Named differently to allow type inference to still work correctly (single element tuples
1214/// are weird in Swift).
1315public func destructureSingle< Element> ( _ elements: some Sequence < Element > ) -> ( Element ) ? {
@@ -70,12 +72,15 @@ public func destructure<Element>(_ elements: some Sequence<Element>) -> (
7072 return ( array [ 0 ] , array [ 1 ] , array [ 2 ] , array [ 3 ] , array [ 4 ] , array [ 5 ] )
7173}
7274
75+ /// Destructures the given `type` into a name and a tuple of 0 generic type parameters if there are exactly 0 generic type parameters.
7376public func destructure( _ type: SimpleType ) -> ( String , ( ) ) ? {
7477 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
7578 ( type. name, arguments)
7679 }
7780}
7881
82+ /// Destructures the given `type` into a name and 1 generic type parameter if there is exactly 1 generic type parameter.
83+ ///
7984/// Named differently to allow type inference to still work correctly (single element tuples
8085/// are weird in Swift).
8186public func destructureSingle( _ type: SimpleType ) -> ( String , ( Type ) ) ? {
@@ -84,42 +89,50 @@ public func destructureSingle(_ type: SimpleType) -> (String, (Type))? {
8489 }
8590}
8691
92+ /// Destructures the given `type` into a name and a tuple of 2 generic type parameters if there are exactly 2 generic type parameters.
8793public func destructure( _ type: SimpleType ) -> ( String , ( Type , Type ) ) ? {
8894 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
8995 ( type. name, arguments)
9096 }
9197}
9298
99+ /// Destructures the given `type` into a name and a tuple of 3 generic type parameters if there are exactly 3 generic type parameters.
93100public func destructure( _ type: SimpleType ) -> ( String , ( Type , Type , Type ) ) ? {
94101 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
95102 ( type. name, arguments)
96103 }
97104}
98105
106+ /// Destructures the given `type` into a name and a tuple of 4 generic type parameters if there are exactly 4 generic type parameters.
99107public func destructure( _ type: SimpleType ) -> ( String , ( Type , Type , Type , Type ) ) ? {
100108 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
101109 ( type. name, arguments)
102110 }
103111}
104112
113+ /// Destructures the given `type` into a name and a tuple of 5 generic type parameters if there are exactly 5 generic type parameters.
105114public func destructure( _ type: SimpleType ) -> ( String , ( Type , Type , Type , Type , Type ) ) ? {
106115 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
107116 ( type. name, arguments)
108117 }
109118}
110119
120+ /// Destructures the given `type` into a name and a tuple of 6 generic type parameters if there are exactly 6 generic type parameters.
111121public func destructure( _ type: SimpleType ) -> ( String , ( Type , Type , Type , Type , Type , Type ) ) ? {
112122 destructure ( type. genericArguments ?? [ ] ) . map { arguments in
113123 ( type. name, arguments)
114124 }
115125}
116126
127+ /// Destructures the given `type` into a tuple of 0 parameter types and a return type if there are exactly 0 parameters.
117128public func destructure( _ type: FunctionType ) -> ( ( ) , Type ) ? {
118129 destructure ( type. parameters) . map { parameters in
119130 ( parameters, type. returnType)
120131 }
121132}
122133
134+ /// Destructures the given `type` into a parameter type and a return type if there is exactly 1 parameter.
135+ ///
123136/// Named differently to allow type inference to still work correctly (single element tuples
124137/// are weird in Swift).
125138public func destructureSingle( _ type: FunctionType ) -> ( ( Type ) , Type ) ? {
@@ -128,36 +141,42 @@ public func destructureSingle(_ type: FunctionType) -> ((Type), Type)? {
128141 }
129142}
130143
144+ /// Destructures the given `type` into a tuple of 2 parameter types and a return type if there are exactly 2 parameters.
131145public func destructure( _ type: FunctionType ) -> ( ( Type , Type ) , Type ) ? {
132146 destructure ( type. parameters) . map { parameters in
133147 ( parameters, type. returnType)
134148 }
135149}
136150
151+ /// Destructures the given `type` into a tuple of 3 parameter types and a return type if there are exactly 3 parameters.
137152public func destructure( _ type: FunctionType ) -> ( ( Type , Type , Type ) , Type ) ? {
138153 destructure ( type. parameters) . map { parameters in
139154 ( parameters, type. returnType)
140155 }
141156}
142157
158+ /// Destructures the given `type` into a tuple of 4 parameter types and a return type if there are exactly 4 parameters.
143159public func destructure( _ type: FunctionType ) -> ( ( Type , Type , Type , Type ) , Type ) ? {
144160 destructure ( type. parameters) . map { parameters in
145161 ( parameters, type. returnType)
146162 }
147163}
148164
165+ /// Destructures the given `type` into a tuple of 5 parameter types and a return type if there are exactly 5 parameters.
149166public func destructure( _ type: FunctionType ) -> ( ( Type , Type , Type , Type , Type ) , Type ) ? {
150167 destructure ( type. parameters) . map { parameters in
151168 ( parameters, type. returnType)
152169 }
153170}
154171
172+ /// Destructures the given `type` into a tuple of 6 parameter types and a return type if there are exactly 6 parameters.
155173public func destructure( _ type: FunctionType ) -> ( ( Type , Type , Type , Type , Type , Type ) , Type ) ? {
156174 destructure ( type. parameters) . map { parameters in
157175 ( parameters, type. returnType)
158176 }
159177}
160178
179+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
161180public func destructure( _ type: Type ) -> DestructuredType < ( ) > ? {
162181 if let type = type. asSimpleType {
163182 return destructure ( type) . map { destructured in
@@ -172,6 +191,8 @@ public func destructure(_ type: Type) -> DestructuredType<()>? {
172191 }
173192}
174193
194+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
195+ ///
175196/// Named differently to allow type inference to still work correctly (single element tuples
176197/// are weird in Swift).
177198public func destructureSingle( _ type: Type ) -> DestructuredType < ( Type ) > ? {
@@ -188,6 +209,7 @@ public func destructureSingle(_ type: Type) -> DestructuredType<(Type)>? {
188209 }
189210}
190211
212+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
191213public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type ) > ? {
192214 if let type = type. asSimpleType {
193215 return destructure ( type) . map { destructured in
@@ -202,6 +224,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type)>? {
202224 }
203225}
204226
227+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
205228public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type ) > ? {
206229 if let type = type. asSimpleType {
207230 return destructure ( type) . map { destructured in
@@ -216,6 +239,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type)>? {
216239 }
217240}
218241
242+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
219243public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type ) > ? {
220244 if let type = type. asSimpleType {
221245 return destructure ( type) . map { destructured in
@@ -230,6 +254,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type, Typ
230254 }
231255}
232256
257+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
233258public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type , Type ) > ? {
234259 if let type = type. asSimpleType {
235260 return destructure ( type) . map { destructured in
@@ -244,6 +269,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type, Typ
244269 }
245270}
246271
272+ /// Destructures the given `type` into a ``DestructuredType`` for easy pattern matching.
247273public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type , Type , Type ) > ? {
248274 if let type = type. asSimpleType {
249275 return destructure ( type) . map { destructured in
0 commit comments