Skip to content

Commit 8d24d3d

Browse files
authored
Migrate six operators to the new abstraction. (#812)
* MapError, Materialize, MaterializeAsResult, AttemptMap * Dematerialize, DematerializeResults
1 parent 5d8101a commit 8d24d3d

File tree

9 files changed

+244
-105
lines changed

9 files changed

+244
-105
lines changed

ReactiveSwift.xcodeproj/project.pbxproj

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,30 @@
6969
9A1D067D1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; };
7070
9A1D067E1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; };
7171
9A1D067F1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; };
72+
9A2D5C4F259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; };
73+
9A2D5C50259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; };
74+
9A2D5C51259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; };
75+
9A2D5C52259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; };
76+
9A2D5C59259F7B31005682ED /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C58259F7B31005682ED /* Materialize.swift */; };
77+
9A2D5C5A259F7B31005682ED /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C58259F7B31005682ED /* Materialize.swift */; };
78+
9A2D5C5B259F7B31005682ED /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C58259F7B31005682ED /* Materialize.swift */; };
79+
9A2D5C5C259F7B31005682ED /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C58259F7B31005682ED /* Materialize.swift */; };
80+
9A2D5C63259F7B47005682ED /* MaterializeAsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */; };
81+
9A2D5C64259F7B47005682ED /* MaterializeAsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */; };
82+
9A2D5C65259F7B47005682ED /* MaterializeAsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */; };
83+
9A2D5C66259F7B47005682ED /* MaterializeAsResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */; };
84+
9A2D5C77259F7D3D005682ED /* AttemptMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C76259F7D3D005682ED /* AttemptMap.swift */; };
85+
9A2D5C78259F7D3D005682ED /* AttemptMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C76259F7D3D005682ED /* AttemptMap.swift */; };
86+
9A2D5C79259F7D3D005682ED /* AttemptMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C76259F7D3D005682ED /* AttemptMap.swift */; };
87+
9A2D5C7A259F7D3D005682ED /* AttemptMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C76259F7D3D005682ED /* AttemptMap.swift */; };
88+
9A2D5C81259F7E3E005682ED /* DematerializeResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */; };
89+
9A2D5C82259F7E3E005682ED /* DematerializeResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */; };
90+
9A2D5C83259F7E3E005682ED /* DematerializeResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */; };
91+
9A2D5C84259F7E3E005682ED /* DematerializeResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */; };
92+
9A2D5C8B259F7ED5005682ED /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */; };
93+
9A2D5C8C259F7ED5005682ED /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */; };
94+
9A2D5C8D259F7ED5005682ED /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */; };
95+
9A2D5C8E259F7ED5005682ED /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */; };
7296
9A67963B1F6056B90058C5B4 /* UninhabitedTypeGuards.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A67963A1F6056B90058C5B4 /* UninhabitedTypeGuards.swift */; };
7397
9A67963C1F6059420058C5B4 /* UninhabitedTypeGuards.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A67963A1F6056B90058C5B4 /* UninhabitedTypeGuards.swift */; };
7498
9A67963D1F6059430058C5B4 /* UninhabitedTypeGuards.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A67963A1F6056B90058C5B4 /* UninhabitedTypeGuards.swift */; };
@@ -264,6 +288,12 @@
264288
9A1A4F981E16961C006F3039 /* ValidatingPropertySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatingPropertySpec.swift; sourceTree = "<group>"; };
265289
9A1B824020835EEC00EB7C09 /* ResultExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultExtensions.swift; sourceTree = "<group>"; };
266290
9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnidirectionalBindingSpec.swift; sourceTree = "<group>"; };
291+
9A2D5C4E259F7B21005682ED /* MapError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapError.swift; sourceTree = "<group>"; };
292+
9A2D5C58259F7B31005682ED /* Materialize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Materialize.swift; sourceTree = "<group>"; };
293+
9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaterializeAsResult.swift; sourceTree = "<group>"; };
294+
9A2D5C76259F7D3D005682ED /* AttemptMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttemptMap.swift; sourceTree = "<group>"; };
295+
9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DematerializeResults.swift; sourceTree = "<group>"; };
296+
9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dematerialize.swift; sourceTree = "<group>"; };
267297
9A67963A1F6056B90058C5B4 /* UninhabitedTypeGuards.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UninhabitedTypeGuards.swift; sourceTree = "<group>"; };
268298
9A681A9D1E5A241B00B097CF /* DeprecationSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeprecationSpec.swift; sourceTree = "<group>"; };
269299
9A9100DE1E0E6E620093E346 /* ValidatingProperty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatingProperty.swift; sourceTree = "<group>"; };
@@ -417,6 +447,12 @@
417447
9AFA491A24E9A925003D263C /* Filter.swift */,
418448
9AFA491F24E9A988003D263C /* CompactMap.swift */,
419449
9AFA492424E9B15C003D263C /* Operators.swift */,
450+
9A2D5C4E259F7B21005682ED /* MapError.swift */,
451+
9A2D5C58259F7B31005682ED /* Materialize.swift */,
452+
9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */,
453+
9A2D5C80259F7E3E005682ED /* DematerializeResults.swift */,
454+
9A2D5C8A259F7ED5005682ED /* Dematerialize.swift */,
455+
9A2D5C76259F7D3D005682ED /* AttemptMap.swift */,
420456
);
421457
path = Observers;
422458
sourceTree = "<group>";
@@ -914,11 +950,14 @@
914950
9A9100E21E0E6E680093E346 /* ValidatingProperty.swift in Sources */,
915951
57A4D1B91BA13D7A00F7D4B1 /* Action.swift in Sources */,
916952
57A4D1BA1BA13D7A00F7D4B1 /* Property.swift in Sources */,
953+
9A2D5C5C259F7B31005682ED /* Materialize.swift in Sources */,
917954
9A090C171DA0309E00EE97CA /* Reactive.swift in Sources */,
918955
57A4D1BB1BA13D7A00F7D4B1 /* Signal.swift in Sources */,
919956
9AFA492824E9B15C003D263C /* Operators.swift in Sources */,
920957
9A67963E1F6059440058C5B4 /* UninhabitedTypeGuards.swift in Sources */,
958+
9A2D5C66259F7B47005682ED /* MaterializeAsResult.swift in Sources */,
921959
9AFA491424E9A196003D263C /* Map.swift in Sources */,
960+
9A2D5C8E259F7ED5005682ED /* Dematerialize.swift in Sources */,
922961
9AFA491E24E9A925003D263C /* Filter.swift in Sources */,
923962
57A4D1BC1BA13D7A00F7D4B1 /* SignalProducer.swift in Sources */,
924963
57A4D1BD1BA13D7A00F7D4B1 /* Atomic.swift in Sources */,
@@ -929,10 +968,13 @@
929968
D85C652D1C0E70E5005A77AD /* Flatten.swift in Sources */,
930969
9ABCB1881D2A5B5A00BCA243 /* Deprecations+Removals.swift in Sources */,
931970
EBCC7DBF1BBF01E200A2AE92 /* Signal.Observer.swift in Sources */,
971+
9A2D5C7A259F7D3D005682ED /* AttemptMap.swift in Sources */,
932972
C79B64801CD52E4E003F2376 /* EventLogger.swift in Sources */,
933973
9AFA492324E9A988003D263C /* CompactMap.swift in Sources */,
934974
4A0E11021D2A92720065D310 /* Lifetime.swift in Sources */,
935975
BE9CF3981D751B71003AE479 /* UnidirectionalBinding.swift in Sources */,
976+
9A2D5C84259F7E3E005682ED /* DematerializeResults.swift in Sources */,
977+
9A2D5C52259F7B21005682ED /* MapError.swift in Sources */,
936978
);
937979
runOnlyForDeploymentPostprocessing = 0;
938980
};
@@ -975,11 +1017,14 @@
9751017
9A9100E11E0E6E680093E346 /* ValidatingProperty.swift in Sources */,
9761018
A9B315C11B3940810001CB9C /* Action.swift in Sources */,
9771019
A9B315C21B3940810001CB9C /* Property.swift in Sources */,
1020+
9A2D5C5B259F7B31005682ED /* Materialize.swift in Sources */,
9781021
9A090C161DA0309E00EE97CA /* Reactive.swift in Sources */,
9791022
A9B315C31B3940810001CB9C /* Signal.swift in Sources */,
9801023
9AFA492724E9B15C003D263C /* Operators.swift in Sources */,
9811024
9A67963D1F6059430058C5B4 /* UninhabitedTypeGuards.swift in Sources */,
1025+
9A2D5C65259F7B47005682ED /* MaterializeAsResult.swift in Sources */,
9821026
9AFA491324E9A196003D263C /* Map.swift in Sources */,
1027+
9A2D5C8D259F7ED5005682ED /* Dematerialize.swift in Sources */,
9831028
9AFA491D24E9A925003D263C /* Filter.swift in Sources */,
9841029
A9B315C41B3940810001CB9C /* SignalProducer.swift in Sources */,
9851030
A9B315C51B3940810001CB9C /* Atomic.swift in Sources */,
@@ -990,10 +1035,13 @@
9901035
D85C652C1C0E70E4005A77AD /* Flatten.swift in Sources */,
9911036
9ABCB1871D2A5B5A00BCA243 /* Deprecations+Removals.swift in Sources */,
9921037
EBCC7DBE1BBF01E200A2AE92 /* Signal.Observer.swift in Sources */,
1038+
9A2D5C79259F7D3D005682ED /* AttemptMap.swift in Sources */,
9931039
C79B647F1CD52E4D003F2376 /* EventLogger.swift in Sources */,
9941040
9AFA492224E9A988003D263C /* CompactMap.swift in Sources */,
9951041
4A0E11011D2A92720065D310 /* Lifetime.swift in Sources */,
9961042
BE9CF3971D751B71003AE479 /* UnidirectionalBinding.swift in Sources */,
1043+
9A2D5C83259F7E3E005682ED /* DematerializeResults.swift in Sources */,
1044+
9A2D5C51259F7B21005682ED /* MapError.swift in Sources */,
9971045
);
9981046
runOnlyForDeploymentPostprocessing = 0;
9991047
};
@@ -1008,11 +1056,14 @@
10081056
EBCC7DBC1BBF010C00A2AE92 /* Signal.Observer.swift in Sources */,
10091057
D03B4A3D19F4C39A009E02AC /* FoundationExtensions.swift in Sources */,
10101058
9A090C141DA0309E00EE97CA /* Reactive.swift in Sources */,
1059+
9A2D5C59259F7B31005682ED /* Materialize.swift in Sources */,
10111060
D08C54B31A69A2AE00AD8286 /* Signal.swift in Sources */,
10121061
D85C652A1C0D84C7005A77AD /* Flatten.swift in Sources */,
10131062
9AFA492524E9B15C003D263C /* Operators.swift in Sources */,
10141063
9A67963B1F6056B90058C5B4 /* UninhabitedTypeGuards.swift in Sources */,
1064+
9A2D5C63259F7B47005682ED /* MaterializeAsResult.swift in Sources */,
10151065
9AFA491124E9A196003D263C /* Map.swift in Sources */,
1066+
9A2D5C8B259F7ED5005682ED /* Dematerialize.swift in Sources */,
10161067
9AFA491B24E9A925003D263C /* Filter.swift in Sources */,
10171068
D0C312CF19EF2A5800984962 /* Bag.swift in Sources */,
10181069
4A0E10FF1D2A92720065D310 /* Lifetime.swift in Sources */,
@@ -1023,10 +1074,13 @@
10231074
D08C54BA1A69C54300AD8286 /* Property.swift in Sources */,
10241075
D0D11AB91A6AE87700C1F8B1 /* Action.swift in Sources */,
10251076
C79B647C1CD52E23003F2376 /* EventLogger.swift in Sources */,
1077+
9A2D5C77259F7D3D005682ED /* AttemptMap.swift in Sources */,
10261078
9ABCB1851D2A5B5A00BCA243 /* Deprecations+Removals.swift in Sources */,
10271079
9AFA492024E9A988003D263C /* CompactMap.swift in Sources */,
10281080
D08C54B81A69A9D000AD8286 /* SignalProducer.swift in Sources */,
10291081
BE9CF3951D751B6B003AE479 /* UnidirectionalBinding.swift in Sources */,
1082+
9A2D5C81259F7E3E005682ED /* DematerializeResults.swift in Sources */,
1083+
9A2D5C4F259F7B21005682ED /* MapError.swift in Sources */,
10301084
);
10311085
runOnlyForDeploymentPostprocessing = 0;
10321086
};
@@ -1069,11 +1123,14 @@
10691123
9A9100E01E0E6E670093E346 /* ValidatingProperty.swift in Sources */,
10701124
9ABCB1861D2A5B5A00BCA243 /* Deprecations+Removals.swift in Sources */,
10711125
EBCC7DBD1BBF01E100A2AE92 /* Signal.Observer.swift in Sources */,
1126+
9A2D5C5A259F7B31005682ED /* Materialize.swift in Sources */,
10721127
9A090C151DA0309E00EE97CA /* Reactive.swift in Sources */,
10731128
D85C652B1C0E70E3005A77AD /* Flatten.swift in Sources */,
10741129
9AFA492624E9B15C003D263C /* Operators.swift in Sources */,
10751130
9A67963C1F6059420058C5B4 /* UninhabitedTypeGuards.swift in Sources */,
1131+
9A2D5C64259F7B47005682ED /* MaterializeAsResult.swift in Sources */,
10761132
9AFA491224E9A196003D263C /* Map.swift in Sources */,
1133+
9A2D5C8C259F7ED5005682ED /* Dematerialize.swift in Sources */,
10771134
9AFA491C24E9A925003D263C /* Filter.swift in Sources */,
10781135
4A0E11001D2A92720065D310 /* Lifetime.swift in Sources */,
10791136
D08C54BB1A69C54400AD8286 /* Property.swift in Sources */,
@@ -1084,10 +1141,13 @@
10841141
C79B647D1CD52E4A003F2376 /* EventLogger.swift in Sources */,
10851142
D0C312CE19EF2A5800984962 /* Atomic.swift in Sources */,
10861143
D0C312E819EF2A5800984962 /* Scheduler.swift in Sources */,
1144+
9A2D5C78259F7D3D005682ED /* AttemptMap.swift in Sources */,
10871145
D0C312D019EF2A5800984962 /* Bag.swift in Sources */,
10881146
9AFA492124E9A988003D263C /* CompactMap.swift in Sources */,
10891147
D0D11ABA1A6AE87700C1F8B1 /* Action.swift in Sources */,
10901148
BE9CF3961D751B70003AE479 /* UnidirectionalBinding.swift in Sources */,
1149+
9A2D5C82259F7E3E005682ED /* DematerializeResults.swift in Sources */,
1150+
9A2D5C50259F7B21005682ED /* MapError.swift in Sources */,
10911151
);
10921152
runOnlyForDeploymentPostprocessing = 0;
10931153
};

Sources/Event.swift

Lines changed: 14 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -220,90 +220,32 @@ extension Signal.Event {
220220
}
221221

222222
internal static func map<U>(_ transform: @escaping (Value) -> U) -> Transformation<U, Error> {
223-
return { action, _ in
224-
Operators.Map(downstream: action, transform: transform)
223+
return { downstream, _ in
224+
Operators.Map(downstream: downstream, transform: transform)
225225
}
226226
}
227227

228228
internal static func mapError<E>(_ transform: @escaping (Error) -> E) -> Transformation<Value, E> {
229-
return { action, _ in
230-
return Signal.Observer { event in
231-
switch event {
232-
case let .value(value):
233-
action(.value(value))
234-
235-
case .completed:
236-
action(.completed)
237-
238-
case let .failed(error):
239-
action(.failed(transform(error)))
240-
241-
case .interrupted:
242-
action(.interrupted)
243-
}
244-
}
229+
return { downstream, _ in
230+
Operators.MapError(downstream: downstream, transform: transform)
245231
}
246232
}
247233

248234
internal static var materialize: Transformation<Signal<Value, Error>.Event, Never> {
249-
return { action, _ in
250-
return Signal.Observer { event in
251-
action(.value(event))
252-
253-
switch event {
254-
case .interrupted:
255-
action(.interrupted)
256-
257-
case .completed, .failed:
258-
action(.completed)
259-
260-
case .value:
261-
break
262-
}
263-
}
235+
return { downstream, _ in
236+
Operators.Materialize(downstream: downstream)
264237
}
265238
}
266239

267240
internal static var materializeResults: Transformation<Result<Value, Error>, Never> {
268-
return { action, _ in
269-
return Signal.Observer { event in
270-
switch event {
271-
case .value(let value):
272-
action(.value(Result(success: value)))
273-
274-
case .failed(let error):
275-
action(.value(Result(failure: error)))
276-
action(.completed)
277-
278-
case .completed:
279-
action(.completed)
280-
281-
case .interrupted:
282-
action(.interrupted)
283-
}
284-
}
241+
return { downstream, _ in
242+
Operators.MaterializeAsResult(downstream: downstream)
285243
}
286244
}
287245

288246
internal static func attemptMap<U>(_ transform: @escaping (Value) -> Result<U, Error>) -> Transformation<U, Error> {
289-
return { action, _ in
290-
return Signal.Observer { event in
291-
switch event {
292-
case let .value(value):
293-
switch transform(value) {
294-
case let .success(value):
295-
action(.value(value))
296-
case let .failure(error):
297-
action(.failed(error))
298-
}
299-
case let .failed(error):
300-
action(.failed(error))
301-
case .completed:
302-
action(.completed)
303-
case .interrupted:
304-
action(.interrupted)
305-
}
306-
}
247+
return { downstream, _ in
248+
Operators.AttemptMap(downstream: downstream, transform: transform)
307249
}
308250
}
309251

@@ -432,49 +374,16 @@ extension Signal.Event {
432374

433375
extension Signal.Event where Value: EventProtocol, Error == Never {
434376
internal static var dematerialize: Transformation<Value.Value, Value.Error> {
435-
return { action, _ in
436-
return Signal.Observer { event in
437-
switch event {
438-
case let .value(innerEvent):
439-
action(innerEvent.event)
440-
441-
case .failed:
442-
fatalError("Never is impossible to construct")
443-
444-
case .completed:
445-
action(.completed)
446-
447-
case .interrupted:
448-
action(.interrupted)
449-
}
450-
}
377+
return { downstream, _ in
378+
Operators.Dematerialize(downstream: downstream)
451379
}
452380
}
453381
}
454382

455383
extension Signal.Event where Value: ResultProtocol, Error == Never {
456384
internal static var dematerializeResults: Transformation<Value.Success, Value.Failure> {
457-
return { action, _ in
458-
return Signal.Observer { event in
459-
let event = event.map { $0.result }
460-
461-
switch event {
462-
case .value(.success(let value)):
463-
action(.value(value))
464-
465-
case .value(.failure(let error)):
466-
action(.failed(error))
467-
468-
case .failed:
469-
fatalError("Never is impossible to construct")
470-
471-
case .completed:
472-
action(.completed)
473-
474-
case .interrupted:
475-
action(.interrupted)
476-
}
477-
}
385+
return { downstream, _ in
386+
Operators.DematerializeResults(downstream: downstream)
478387
}
479388
}
480389
}

Sources/Observers/AttemptMap.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
extension Operators {
2+
internal final class AttemptMap<InputValue, OutputValue, Error: Swift.Error>: Observer<InputValue, Error> {
3+
let downstream: Observer<OutputValue, Error>
4+
let transform: (InputValue) -> Result<OutputValue, Error>
5+
6+
init(downstream: Observer<OutputValue, Error>, transform: @escaping (InputValue) -> Result<OutputValue, Error>) {
7+
self.downstream = downstream
8+
self.transform = transform
9+
}
10+
11+
override func receive(_ value: InputValue) {
12+
switch transform(value) {
13+
case let .success(value):
14+
downstream.receive(value)
15+
case let .failure(error):
16+
downstream.terminate(.failed(error))
17+
}
18+
}
19+
20+
override func terminate(_ termination: Termination<Error>) {
21+
downstream.terminate(termination)
22+
}
23+
}
24+
}

Sources/Observers/Dematerialize.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
extension Operators {
2+
internal final class Dematerialize<Event>: Observer<Event, Never> where Event: EventProtocol {
3+
let downstream: Observer<Event.Value, Event.Error>
4+
5+
init(downstream: Observer<Event.Value, Event.Error>) {
6+
self.downstream = downstream
7+
}
8+
9+
override func receive(_ event: Event) {
10+
switch event.event {
11+
case let .value(value):
12+
downstream.receive(value)
13+
case .completed:
14+
downstream.terminate(.completed)
15+
case .interrupted:
16+
downstream.terminate(.interrupted)
17+
case let .failed(error):
18+
downstream.terminate(.failed(error))
19+
}
20+
}
21+
22+
override func terminate(_ termination: Termination<Never>) {
23+
switch termination {
24+
case .completed:
25+
downstream.terminate(.completed)
26+
case .interrupted:
27+
downstream.terminate(.interrupted)
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)