@@ -25,71 +25,63 @@ public enum Delta<Element>: ~Copyable where Element: ~Copyable {
25
25
26
26
/// A source element.
27
27
///
28
- /// Conceptually, this is a value that was deleted and thus no target element is available.
29
- case deleted ( source: Element )
28
+ /// Conceptually, this case represents a value where the element was deleted and thus no target element is available.
29
+ case source( Element )
30
30
/// A target element.
31
31
///
32
- /// Conceptually, this is a value that was added and thus no source element is available.
33
- case added ( target: Element )
34
- /// A source element and a target element.
32
+ /// Conceptually, this case represents a value where the element was added and thus no source element is available.
33
+ case target( Element )
34
+ /// The combination of a source element and a target element.
35
35
///
36
- /// Conceptually, this is a value that was modified and both the source and the target element are available.
37
- /// The source and target elements can be different or equal.
38
- case modified( source: Element , target: Element )
36
+ /// Conceptually, this case represents a value where an element was modified or kept the same and thus both a source and a target element are available.
37
+ case transition( source: Element , target: Element )
39
38
}
40
39
41
40
public extension Delta where Element: ~ Copyable {
42
- /// Creates a modified delta from a source and a target element .
41
+ /// Creates a transition delta.
43
42
@inlinable @inline ( __always)
44
43
init ( source: consuming Element , target: consuming Element ) {
45
44
self = . transition( source: source, target: target)
46
45
}
47
46
48
- /// Creates a delta from a source and a target element.
49
- ///
50
- /// If the source element is `nil`, the delta is `.added(target:)`.
51
- /// Otherwise, the delta is `.modified(source:target:)`.
47
+ /// Creates a target delta if `source` is `nil`; otherwise, creates a transition delta.
52
48
@inlinable
53
49
init ( source: consuming Element ? , target: consuming Element ) {
54
50
if let source {
55
- self = . modified ( source: source, target: target)
51
+ self = . transition ( source: source, target: target)
56
52
}
57
53
else {
58
- self = . added ( target: target)
54
+ self = . target( target)
59
55
}
60
56
}
61
57
62
- /// Creates a delta from a source and a target element.
63
- ///
64
- /// If the target element is `nil`, the delta is `.deleted(source:)`.
65
- /// Otherwise, the delta is `.modified(source:target:)`.
58
+ /// Creates a source delta if `target` is `nil`; otherwise, creates a transition delta.
66
59
@inlinable
67
60
init ( source: consuming Element , target: consuming Element ? ) {
68
61
if let target {
69
- self = . modified ( source: source, target: target)
62
+ self = . transition ( source: source, target: target)
70
63
}
71
64
else {
72
- self = . deleted ( source: source)
65
+ self = . source( source)
73
66
}
74
67
}
75
68
76
- /// Creates a delta from a source and a target element .
69
+ /// Creates a delta when one or both elements are non-`nil`; otherwise, returns `nil` .
77
70
///
78
- /// If both the source and the target element are `nil`, the delta is `nil` .
79
- /// If the source element is `nil`, the delta is `.added(target:)` .
80
- /// If the target element is `nil`, the delta is `.deleted(source:)` .
81
- /// Otherwise, the delta is `.modified(source:target:) `.
71
+ /// - If both the source and target are non- `nil`, creates a transition delta .
72
+ /// - Else, if the source is non- `nil`, creates a source delta .
73
+ /// - Else, if the target is non- `nil`, creates a target delta .
74
+ /// - Otherwise, returns `nil `.
82
75
@inlinable
83
76
init ? ( source: consuming Element ? , target: consuming Element ? ) {
84
- if source != nil && target != nil {
85
- // `if let source, let target` does not work with non-copyable types here
86
- self = . modified( source: source!, target: target!)
77
+ if let source = source. take ( ) , let target = target. take ( ) {
78
+ self = . transition( source: source, target: target)
87
79
}
88
80
else if let source {
89
- self = . deleted ( source: source)
81
+ self = . source( source)
90
82
}
91
83
else if let target {
92
- self = . added ( target: target)
84
+ self = . target( target)
93
85
}
94
86
else {
95
87
return nil
@@ -104,12 +96,12 @@ public extension Delta where Element: ~Copyable {
104
96
_ transform: ( consuming Element ) throws ( E ) -> T
105
97
) throws ( E) -> Delta < T > {
106
98
switch consume self {
107
- case . deleted ( let source) :
108
- . deleted ( source: try transform ( source) )
109
- case . added ( let target) :
110
- . added ( target: try transform ( target) )
111
- case . modified ( let source, let target) :
112
- . modified ( source: try transform ( source) , target: try transform ( target) )
99
+ case . source ( let source) :
100
+ . source( try transform ( source) )
101
+ case . target ( let target) :
102
+ . target( try transform ( target) )
103
+ case . transition ( let source, let target) :
104
+ . transition ( source: try transform ( source) , target: try transform ( target) )
113
105
}
114
106
}
115
107
@@ -119,22 +111,22 @@ public extension Delta where Element: ~Copyable {
119
111
_ transform: ( consuming Element ) throws ( E ) -> T ?
120
112
) throws ( E) -> Delta < T > ? {
121
113
switch consume self {
122
- case . deleted ( let source) :
114
+ case . source ( let source) :
123
115
guard let source = try transform ( source) else {
124
116
return nil
125
117
}
126
- return . deleted ( source: source)
127
- case . added ( let target) :
118
+ return . source( source)
119
+ case . target ( let target) :
128
120
guard let target = try transform ( target) else {
129
121
return nil
130
122
}
131
- return . added ( target: target)
132
- case . modified ( let source, let target) :
123
+ return . target( target)
124
+ case . transition ( let source, let target) :
133
125
guard let source = try transform ( source) ,
134
126
let target = try transform ( target) else {
135
127
return nil
136
128
}
137
- return . modified ( source: source, target: target)
129
+ return . transition ( source: source, target: target)
138
130
}
139
131
}
140
132
@@ -147,15 +139,15 @@ public extension Delta where Element: ~Copyable {
147
139
switch side {
148
140
case . source:
149
141
switch consume self {
150
- case . deleted ( let source) : source
151
- case . added ( let target) : target
152
- case . modified ( let source, _) : source
142
+ case . source ( let source) : source
143
+ case . target ( let target) : target
144
+ case . transition ( let source, _) : source
153
145
}
154
146
case . target:
155
147
switch consume self {
156
- case . deleted ( let source) : source
157
- case . added ( let target) : target
158
- case . modified ( _, let target) : target
148
+ case . source ( let source) : source
149
+ case . target ( let target) : target
150
+ case . transition ( _, let target) : target
159
151
}
160
152
}
161
153
}
@@ -166,93 +158,93 @@ public extension Delta where Element: ~Copyable {
166
158
combine: ( consuming Element , consuming Element ) throws ( E ) -> Element
167
159
) throws ( E) -> Element {
168
160
switch consume self {
169
- case . deleted ( let source) :
161
+ case . source ( let source) :
170
162
source
171
- case . added ( let target) :
163
+ case . target ( let target) :
172
164
target
173
- case . modified ( let source, let target) :
165
+ case . transition ( let source, let target) :
174
166
try combine ( source, target)
175
167
}
176
168
}
177
169
}
178
170
179
171
extension Delta : Copyable where Element: Copyable {
180
- /// Returns a modified delta where both the source and target share the same element.
172
+ /// Returns a transition delta where both the source and target share the same element.
181
173
@inlinable @inline ( __always)
182
- public static func equal ( _ element: Element ) -> Self {
183
- . modified ( source: element, target: element)
174
+ public static func transition ( _ element: Element ) -> Self {
175
+ . transition ( source: element, target: element)
184
176
}
185
177
186
- /// The source element, if the delta value is not of type `.added `.
178
+ /// The source element, if available; otherwise, `nil `.
187
179
@inlinable @inline ( __always)
188
180
public var source : Element ? {
189
181
switch self {
190
- case . deleted ( let source) : source
191
- case . added ( _) : nil
192
- case . modified ( let source, _) : source
182
+ case . source ( let source) : source
183
+ case . target ( _) : nil
184
+ case . transition ( let source, _) : source
193
185
}
194
186
}
195
187
196
- /// The target element, if the delta value is not of type `.deleted `.
188
+ /// The target element, if available; otherwise, `nil `.
197
189
@inlinable @inline ( __always)
198
190
public var target : Element ? {
199
191
switch self {
200
- case . deleted ( _) : nil
201
- case . added ( let target) : target
202
- case . modified ( _, let target) : target
192
+ case . source ( _) : nil
193
+ case . target ( let target) : target
194
+ case . transition ( _, let target) : target
203
195
}
204
196
}
205
197
206
198
/// Returns a delta containing the results of mapping the given closure over the delta’s elements.
207
199
///
208
- /// In the `.modified` case, `transform` is applied concurrently to both sides .
200
+ /// In the transition case, both elements are transformed concurrently .
209
201
@available ( macOS 10 . 15 , iOS 13 , tvOS 13 , visionOS 1 , watchOS 6 , * )
210
202
@inlinable
211
203
public func asyncMap< T> (
212
- _ transform: @Sendable ( consuming Element ) async -> T
204
+ _ transform: @Sendable ( Element) async -> T
213
205
) async -> Delta < T > where Element: Sendable {
214
206
switch self {
215
- case . deleted ( let source) :
216
- return . deleted ( source: await transform ( source) )
217
- case . added ( let target) :
218
- return . added ( target: await transform ( target) )
219
- case . modified ( let source, let target) :
207
+ case . source ( let source) :
208
+ return . source( await transform ( source) )
209
+ case . target ( let target) :
210
+ return . target( await transform ( target) )
211
+ case . transition ( let source, let target) :
220
212
async let transformedSource = transform ( source)
221
213
async let transformedTarget = transform ( target)
222
- return await . modified ( source: transformedSource, target: transformedTarget)
214
+ return await . transition ( source: transformedSource, target: transformedTarget)
223
215
}
224
216
}
225
217
226
218
/// Returns a delta containing the results of mapping the given closure over the delta’s elements.
227
219
///
228
- /// In the `.modified` case, `transform` is applied concurrently to both sides .
220
+ /// In the transition case, both elements are transformed concurrently .
229
221
@available ( macOS 10 . 15 , iOS 13 , tvOS 13 , visionOS 1 , watchOS 6 , * )
230
222
@inlinable
231
223
public func asyncMap< T> (
232
- _ transform: @Sendable ( consuming Element ) async throws -> T
224
+ _ transform: @Sendable ( Element) async throws -> T
233
225
) async throws -> Delta < T > where Element: Sendable {
234
226
switch self {
235
- case . deleted ( let source) :
236
- return . deleted ( source: try await transform ( source) )
237
- case . added ( let target) :
238
- return . added ( target: try await transform ( target) )
239
- case . modified ( let source, let target) :
227
+ case . source ( let source) :
228
+ return . source( try await transform ( source) )
229
+ case . target ( let target) :
230
+ return . target( try await transform ( target) )
231
+ case . transition ( let source, let target) :
240
232
async let transformedSource = transform ( source)
241
233
async let transformedTarget = transform ( target)
242
- return try await . modified ( source: transformedSource, target: transformedTarget)
234
+ return try await . transition ( source: transformedSource, target: transformedTarget)
243
235
}
244
236
}
245
237
}
246
238
247
239
extension Delta : CustomDebugStringConvertible {
248
240
public var debugDescription : String {
249
241
switch self {
250
- case . deleted ( let source) :
251
- " Delta.deleted( \( source) ) "
252
- case . added ( let target) :
253
- " Delta.added( \( target) ) "
254
- case . modified ( let source, let target) :
255
- " Delta.modified( \( source) , \( target) ) "
242
+ case . source ( let source) :
243
+ " Delta(source: \( source) ) "
244
+ case . target ( let target) :
245
+ " Delta(target: \( target) ) "
246
+ case . transition ( let source, let target) :
247
+ " Delta(source: \( source) , target: \( target) ) "
256
248
}
257
249
}
258
250
}
@@ -271,13 +263,13 @@ public extension Delta where Element: ~Copyable {
271
263
extension Delta : Encodable where Element: Encodable {
272
264
public func encode( to encoder: any Encoder ) throws {
273
265
switch self {
274
- case . deleted ( let source) :
266
+ case . source ( let source) :
275
267
var container = encoder. container ( keyedBy: CodingKeys . self)
276
268
try container. encode ( source, forKey: . source)
277
- case . added ( let target) :
269
+ case . target ( let target) :
278
270
var container = encoder. container ( keyedBy: CodingKeys . self)
279
271
try container. encode ( target, forKey: . target)
280
- case . modified ( let source, let target) :
272
+ case . transition ( let source, let target) :
281
273
var container = encoder. container ( keyedBy: CodingKeys . self)
282
274
try container. encode ( source, forKey: . source)
283
275
try container. encode ( target, forKey: . target)
@@ -292,13 +284,13 @@ extension Delta: Decodable where Element: Decodable {
292
284
let target = try container. decodeIfPresent ( Element . self, forKey: . target)
293
285
294
286
if let source, let target {
295
- self = . modified ( source: source, target: target)
287
+ self = . transition ( source: source, target: target)
296
288
}
297
289
else if let source {
298
- self = . deleted ( source: source)
290
+ self = . source( source)
299
291
}
300
292
else if let target {
301
- self = . added ( target: target)
293
+ self = . target( target)
302
294
}
303
295
else {
304
296
throw DecodingError . dataCorrupted ( DecodingError . Context ( codingPath: decoder. codingPath, debugDescription: " No source or target value. " ) )
0 commit comments