@@ -27,10 +27,10 @@ enum TL {
27
27
static var number : Int = 0
28
28
29
29
@TaskLocal
30
- static var never : StringLike = " <never> "
30
+ static var never : StringLike = . init ( " <never> " )
31
31
32
32
@TaskLocal
33
- static var clazz : ClassTaskLocal = nil
33
+ static var clazz : ClassTaskLocal ? = nil
34
34
}
35
35
36
36
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
@@ -45,37 +45,39 @@ final class ClassTaskLocal {
45
45
}
46
46
47
47
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
48
- func printTaskLocal< Key> (
49
- _ key: KeyPath < TaskLocalValues , Key > ,
50
- _ expected: Key . Value ? = nil ,
51
- file: String = #file, line: UInt = #line, function: String = #function
52
- ) where Key: TaskLocalKey {
53
- let value = Task . local ( key)
54
- print ( " \( Key . self) : \( value) at \( file) : \( line) " )
48
+ @discardableResult
49
+ func printTaskLocal< V, Key> (
50
+ _ key: Key ,
51
+ _ expected: V ? = nil ,
52
+ file: String = #file, line: UInt = #line
53
+ ) -> V ? where Key: TaskLocal < V > {
54
+ let value = key
55
+ print ( " \( value) at \( file) : \( line) " )
55
56
if let expected = expected {
56
- assert ( " \( expected) " == " \( value) " ,
57
- " Expected [ \( expected) ] but found: \( value) , at \( file) : \( line) " )
57
+ assert ( " \( expected) " == " \( value. wrappedValue ) " ,
58
+ " Expected [ \( expected) ] but found: \( value) , at \( file) : \( line) " )
58
59
}
60
+ return expected
59
61
}
60
62
61
63
// ==== ------------------------------------------------------------------------
62
64
63
65
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
64
66
func simple( ) async {
65
- printTaskLocal ( TL . $number) // CHECK: TaskLocal<Int>(2 )
67
+ printTaskLocal ( TL . $number) // CHECK: TaskLocal<Int>(0 )
66
68
await TL . $number. withValue ( 1 ) {
67
69
printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(1)
68
70
}
69
71
}
70
72
71
73
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
72
74
func simple_deinit( ) async {
73
- await Task . withLocal ( \ . clazz, boundTo : ClassTaskLocal ( ) ) {
75
+ await TL . $ clazz. withValue ( ClassTaskLocal ( ) ) {
74
76
// CHECK: clazz init [[C:.*]]
75
- printTaskLocal ( \ . clazz) // CHECK: ClazzKey: Optional( main.ClassTaskLocal) {{.*}}
77
+ printTaskLocal ( TL . $ clazz) // CHECK: TaskLocal< Optional<ClassTaskLocal>>(Optional( main.ClassTaskLocal))
76
78
}
77
79
// CHECK: clazz deinit [[C]]
78
- printTaskLocal ( \ . clazz) // CHECK: ClazzKey: nil {{.*}}
80
+ printTaskLocal ( TL . $ clazz) // CHECK: TaskLocal<Optional<ClassTaskLocal>>( nil)
79
81
}
80
82
81
83
struct Boom : Error {
@@ -84,7 +86,7 @@ struct Boom: Error {
84
86
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
85
87
func simple_throw( ) async {
86
88
do {
87
- try await Task . withLocal ( \ . clazz, boundTo : ClassTaskLocal ( ) ) {
89
+ try await TL . $ clazz. withValue ( ClassTaskLocal ( ) ) {
88
90
throw Boom ( value: " oh no! " )
89
91
}
90
92
} catch {
@@ -95,59 +97,59 @@ func simple_throw() async {
95
97
96
98
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
97
99
func nested( ) async {
98
- printTaskLocal ( \ . string) // CHECK: StringKey: < undefined> {{.*}}
99
- await Task . withLocal ( \ . string, boundTo : " hello " ) {
100
- printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(2 )
101
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: hello {{.*}}
100
+ printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(< undefined>)
101
+ await TL . $ string. withValue ( " hello " ) {
102
+ printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(0 )
103
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( hello)
102
104
await TL . $number. withValue ( 2 ) {
103
105
printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(2)
104
- printTaskLocal ( \ . string, " hello " ) // CHECK: StringKey: hello {{.*}}
106
+ printTaskLocal ( TL . $ string, " hello " ) // CHECK: TaskLocal<String>( hello)
105
107
}
106
- printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(2 )
107
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: hello {{.*}}
108
+ printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(0 )
109
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( hello)
108
110
}
109
- printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(2 )
110
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: < undefined> {{.*}}
111
+ printTaskLocal ( TL . $number) // CHECK-NEXT: TaskLocal<Int>(0 )
112
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(< undefined>)
111
113
}
112
114
113
115
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
114
116
func nested_allContribute( ) async {
115
- printTaskLocal ( \ . string) // CHECK: StringKey: < undefined> {{.*}}
116
- await Task . withLocal ( \ . string, boundTo : " one " ) {
117
- printTaskLocal ( \ . string, " one " ) // CHECK-NEXT: StringKey: one {{.*}}
118
- await Task . withLocal ( \ . string, boundTo : " two " ) {
119
- printTaskLocal ( \ . string, " two " ) // CHECK-NEXT: StringKey: two {{.*}}
120
- await Task . withLocal ( \ . string, boundTo : " three " ) {
121
- printTaskLocal ( \ . string, " three " ) // CHECK-NEXT: StringKey: three {{.*}}
117
+ printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(< undefined>)
118
+ await TL . $ string. withValue ( " one " ) {
119
+ printTaskLocal ( TL . $ string, " one " ) // CHECK-NEXT: TaskLocal<String>( one)
120
+ await TL . $ string. withValue ( " two " ) {
121
+ printTaskLocal ( TL . $ string, " two " ) // CHECK-NEXT: TaskLocal<String>( two)
122
+ await TL . $ string. withValue ( " three " ) {
123
+ printTaskLocal ( TL . $ string, " three " ) // CHECK-NEXT: TaskLocal<String>( three)
122
124
}
123
- printTaskLocal ( \ . string, " two " ) // CHECK-NEXT: StringKey: two {{.*}}
125
+ printTaskLocal ( TL . $ string, " two " ) // CHECK-NEXT: TaskLocal<String>( two)
124
126
}
125
- printTaskLocal ( \ . string, " one " ) // CHECK-NEXT: StringKey: one {{.*}}
127
+ printTaskLocal ( TL . $ string, " one " ) // CHECK-NEXT: TaskLocal<String>( one)
126
128
}
127
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: < undefined> {{.*}}
129
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(< undefined>)
128
130
}
129
131
130
132
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
131
133
func nested_3_onlyTopContributes( ) async {
132
- printTaskLocal ( \ . string) // CHECK: StringKey: < undefined> {{.*}}
133
- await Task . withLocal ( \ . string, boundTo : " one " ) {
134
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: one {{.*}}
134
+ printTaskLocal ( TL . $ string) // CHECK: TaskLocal<String>(< undefined>)
135
+ await TL . $ string. withValue ( " one " ) {
136
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( one)
135
137
await TL . $number. withValue ( 2 ) {
136
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: one {{.*}}
138
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( one)
137
139
await TL . $number. withValue ( 3 ) {
138
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: one {{.*}}
140
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( one)
139
141
}
140
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: one {{.*}}
142
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( one)
141
143
}
142
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: one {{.*}}
144
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>( one)
143
145
}
144
- printTaskLocal ( \ . string) // CHECK-NEXT: StringKey: < undefined> {{.*}}
146
+ printTaskLocal ( TL . $ string) // CHECK-NEXT: TaskLocal<String>(< undefined>)
145
147
}
146
148
147
149
@available ( macOS 9999 , iOS 9999 , watchOS 9999 , tvOS 9999 , * )
148
150
func withLocal_body_mustNotEscape( ) async {
149
151
var something = " Nice "
150
- await Task . withLocal ( \ . string, boundTo : " xxx " ) {
152
+ await TL . $ string. withValue ( " xxx " ) {
151
153
something = " very nice "
152
154
}
153
155
_ = something // silence not used warning
0 commit comments