import Combine import ComposableArchitecture import UIKit final class IfLetStoreController: UIViewController { let store: Store let ifDestination: (Store) -> UIViewController let elseDestination: () -> UIViewController private var cancellables: Set = [] private var viewController = UIViewController() { willSet { self.viewController.willMove(toParent: nil) self.viewController.view.removeFromSuperview() self.viewController.removeFromParent() self.addChild(newValue) self.view.addSubview(newValue.view) newValue.didMove(toParent: self) } } init( store: Store, then ifDestination: @escaping (Store) -> UIViewController, else elseDestination: @escaping () -> UIViewController ) { self.store = store self.ifDestination = ifDestination self.elseDestination = elseDestination super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() self.store.ifLet( then: { [weak self] store in guard let self = self else { return } self.viewController = self.ifDestination(store) }, else: { [weak self] in guard let self = self else { return } self.viewController = self.elseDestination() } ) .store(in: &self.cancellables) } }