From 033bb35527042c935dc8519f34a4db129fe5b1fa Mon Sep 17 00:00:00 2001 From: Paul Wood Date: Mon, 12 Aug 2019 13:10:07 -0400 Subject: [PATCH 1/2] add a test displaying a system used as a feedback of another system bonus points for those about to rock --- .../CombineFeedbackTests.swift | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/Tests/CombineFeedbackTests/CombineFeedbackTests.swift b/Tests/CombineFeedbackTests/CombineFeedbackTests.swift index 9c6fabe..4f40cbe 100644 --- a/Tests/CombineFeedbackTests/CombineFeedbackTests.swift +++ b/Tests/CombineFeedbackTests/CombineFeedbackTests.swift @@ -128,4 +128,58 @@ class CombineFeedbackTests: XCTestCase { XCTAssertEqual("initial_a", value) } + + func test_system_in_a_system() { + let scheduler = TestScheduler() + + let feedback1 = Feedback(effects: { state -> AnyPublisher in + if state.count % 3 == 1 { + return Just("a").eraseToAnyPublisher() + } else { + return Empty().eraseToAnyPublisher() + } + }) + + let feedback2 = Feedback(effects: { state -> AnyPublisher in + if state.count % 3 == 0 { + return Just("d").eraseToAnyPublisher() + } else { + return Empty().eraseToAnyPublisher() + } + }) + + let innerSystem = Feedback{ (stringPublisher: AnyPublisher) -> AnyPublisher in + return stringPublisher.flatMap { (string) -> AnyPublisher in + return Publishers.system(initial: string, + feedbacks: [feedback1, feedback2], + scheduler: scheduler) { (state: String, event: String) -> String in + return state + event + }.filter({ (state) -> Bool in + state.count % 2 == 0 + }).map({ (state) -> String in + return state + "c" + }).eraseToAnyPublisher() + }.eraseToAnyPublisher() + } + + let outerSystem = Publishers.system( + initial: "initial", + feedbacks: [innerSystem], + scheduler: scheduler, + reduce: { (state: String, event: String) -> String in + return event + } + ) + + var value: String? + + _ = outerSystem.sink( + receiveValue: { + value = $0 + } + ) + + scheduler.advance() + XCTAssertEqual("initialacdc", value) + } } From 4c2b1b04501f3933f136360819a50d23e93c0f11 Mon Sep 17 00:00:00 2001 From: sergdort Date: Tue, 27 Aug 2019 22:58:15 +0100 Subject: [PATCH 2/2] Add a workaround for toggle --- Example/SignIn/SignIn.swift | 56 ++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/Example/SignIn/SignIn.swift b/Example/SignIn/SignIn.swift index ed1867e..c506dc9 100644 --- a/Example/SignIn/SignIn.swift +++ b/Example/SignIn/SignIn.swift @@ -11,7 +11,7 @@ final class SignInViewModel: ViewModel + let animated = true + + func makeUIView(context: UIViewRepresentableContext) -> UISwitch { + let view = UISwitch(frame: .zero) + + view.addTarget( + context.coordinator, + action: #selector(Target.action(_:)), + for: .valueChanged + ) + + return view + } + + func updateUIView(_ uiView: UISwitch, context: UIViewRepresentableContext) { + uiView.setOn(isOn.wrappedValue, animated: animated) + } + + func makeCoordinator() -> Target { + return Target { (view) in + self.isOn.wrappedValue = view.isOn + } + } + + class Target: NSObject { + init(action: @escaping (UISwitch) -> Void) { + self._action = action + } + + private let _action: (UISwitch) -> Void + + @objc + func action(_ sender: UISwitch) { + _action(sender) + } + } +}