@@ -7,6 +7,7 @@ public func destructure<Element>(_ elements: some Sequence<Element>) -> ()? {
7
7
return ( )
8
8
}
9
9
10
+ /// Destructures the given `elements` into a single element if there is exactly one element.
10
11
/// Named differently to allow type inference to still work correctly (single element tuples
11
12
/// are weird in Swift).
12
13
public func destructureSingle< Element> ( _ elements: some Sequence < Element > ) -> ( Element ) ? {
@@ -17,6 +18,7 @@ public func destructureSingle<Element>(_ elements: some Sequence<Element>) -> (E
17
18
return ( array [ 0 ] )
18
19
}
19
20
21
+ /// Destructures the given `elements` into a tuple of 2 elements if there are exactly 2 elements.
20
22
public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element ) ? {
21
23
let array = Array ( elements)
22
24
guard array. count == 2 else {
@@ -25,31 +27,42 @@ public func destructure<Element>(_ elements: some Sequence<Element>) -> (Element
25
27
return ( array [ 0 ] , array [ 1 ] )
26
28
}
27
29
28
- public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element , Element ) ? {
30
+ /// Destructures the given `elements` into a tuple of 3 elements if there are exactly 3 elements.
31
+ public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element , Element ) ?
32
+ {
29
33
let array = Array ( elements)
30
34
guard array. count == 3 else {
31
35
return nil
32
36
}
33
37
return ( array [ 0 ] , array [ 1 ] , array [ 2 ] )
34
38
}
35
39
36
- public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element , Element , Element ) ? {
40
+ /// Destructures the given `elements` into a tuple of 4 elements if there are exactly 4 elements.
41
+ public func destructure< Element> ( _ elements: some Sequence < Element > ) -> (
42
+ Element , Element , Element , Element
43
+ ) ? {
37
44
let array = Array ( elements)
38
45
guard array. count == 4 else {
39
46
return nil
40
47
}
41
48
return ( array [ 0 ] , array [ 1 ] , array [ 2 ] , array [ 3 ] )
42
49
}
43
50
44
- public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element , Element , Element , Element ) ? {
51
+ /// Destructures the given `elements` into a tuple of 5 elements if there are exactly 5 elements.
52
+ public func destructure< Element> ( _ elements: some Sequence < Element > ) -> (
53
+ Element , Element , Element , Element , Element
54
+ ) ? {
45
55
let array = Array ( elements)
46
56
guard array. count == 5 else {
47
57
return nil
48
58
}
49
59
return ( array [ 0 ] , array [ 1 ] , array [ 2 ] , array [ 3 ] , array [ 4 ] )
50
60
}
51
61
52
- public func destructure< Element> ( _ elements: some Sequence < Element > ) -> ( Element , Element , Element , Element , Element , Element ) ? {
62
+ /// Destructures the given `elements` into a tuple of 6 elements if there are exactly 6 elements.
63
+ public func destructure< Element> ( _ elements: some Sequence < Element > ) -> (
64
+ Element , Element , Element , Element , Element , Element
65
+ ) ? {
53
66
let array = Array ( elements)
54
67
guard array. count == 6 else {
55
68
return nil
@@ -148,7 +161,7 @@ public func destructure(_ type: FunctionType) -> ((Type, Type, Type, Type, Type,
148
161
public func destructure( _ type: Type ) -> DestructuredType < ( ) > ? {
149
162
if let type = type. asSimpleType {
150
163
return destructure ( type) . map { destructured in
151
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
164
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
152
165
}
153
166
} else if let type = type. asFunctionType {
154
167
return destructure ( type) . map { destructured in
@@ -164,7 +177,7 @@ public func destructure(_ type: Type) -> DestructuredType<()>? {
164
177
public func destructureSingle( _ type: Type ) -> DestructuredType < ( Type ) > ? {
165
178
if let type = type. asSimpleType {
166
179
return destructureSingle ( type) . map { destructured in
167
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
180
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
168
181
}
169
182
} else if let type = type. asFunctionType {
170
183
return destructureSingle ( type) . map { destructured in
@@ -178,7 +191,7 @@ public func destructureSingle(_ type: Type) -> DestructuredType<(Type)>? {
178
191
public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type ) > ? {
179
192
if let type = type. asSimpleType {
180
193
return destructure ( type) . map { destructured in
181
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
194
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
182
195
}
183
196
} else if let type = type. asFunctionType {
184
197
return destructure ( type) . map { destructured in
@@ -192,7 +205,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type)>? {
192
205
public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type ) > ? {
193
206
if let type = type. asSimpleType {
194
207
return destructure ( type) . map { destructured in
195
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
208
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
196
209
}
197
210
} else if let type = type. asFunctionType {
198
211
return destructure ( type) . map { destructured in
@@ -206,7 +219,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type)>? {
206
219
public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type ) > ? {
207
220
if let type = type. asSimpleType {
208
221
return destructure ( type) . map { destructured in
209
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
222
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
210
223
}
211
224
} else if let type = type. asFunctionType {
212
225
return destructure ( type) . map { destructured in
@@ -220,7 +233,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type, Typ
220
233
public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type , Type ) > ? {
221
234
if let type = type. asSimpleType {
222
235
return destructure ( type) . map { destructured in
223
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
236
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
224
237
}
225
238
} else if let type = type. asFunctionType {
226
239
return destructure ( type) . map { destructured in
@@ -234,7 +247,7 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type, Typ
234
247
public func destructure( _ type: Type ) -> DestructuredType < ( Type , Type , Type , Type , Type , Type ) > ? {
235
248
if let type = type. asSimpleType {
236
249
return destructure ( type) . map { destructured in
237
- . nominal ( name: destructured. 0 , genericArguments: destructured. 1 )
250
+ . simple ( name: destructured. 0 , genericArguments: destructured. 1 )
238
251
}
239
252
} else if let type = type. asFunctionType {
240
253
return destructure ( type) . map { destructured in
@@ -245,8 +258,10 @@ public func destructure(_ type: Type) -> DestructuredType<(Type, Type, Type, Typ
245
258
}
246
259
}
247
260
248
- /// A destructured type (e.g. `Result<Success, Failure>` => `.nominal (name: "Result", genericArguments: ("Success", "Failure"))`).
261
+ /// A destructured type (e.g. `Result<Success, Failure>` becomes `.simple (name: "Result", genericArguments: ("Success", "Failure"))`).
249
262
public enum DestructuredType < TypeList> {
250
- case nominal( name: String , genericArguments: TypeList )
263
+ /// A simple type (often referred to as a nominal type) such as `Int` or `Array<String>`.
264
+ case simple( name: String , genericArguments: TypeList )
265
+ /// A function type such as `(Int) -> Void`.
251
266
case function( parameterTypes: TypeList , returnType: Type )
252
267
}
0 commit comments