/** * Tae Won Ha - http://taewon.de - @hataewon * See LICENSE */ import Cocoa import RxSwift protocol Flow { var sink: Observable { get } } protocol Store: Flow {} protocol Component: Flow {} class StandardFlow: Flow { var sink: Observable { return self.subject.asObservable() } let subject = PublishSubject() let source: Observable let disposeBag = DisposeBag() init(source: Observable) { self.source = source self.subscription(source: source).addDisposableTo(self.disposeBag) } deinit { self.subject.onCompleted() } func subscription(source source: Observable) -> Disposable { preconditionFailure("Please override") } func publish(event event: Any) { self.subject.onNext(event) } } class StandardComponent: NSObject, Component { var sink: Observable { return self.subject.asObservable() } let subject = PublishSubject() let source: Observable let disposeBag = DisposeBag() init(source: Observable) { self.source = source super.init() self.addViews() self.subscription(source: source).addDisposableTo(self.disposeBag) } deinit { self.subject.onCompleted() } func addViews() { preconditionFailure("Please override") } func subscription(source source: Observable) -> Disposable { preconditionFailure("Please override") } func publish(event event: Any) { self.subject.onNext(event) } } class WindowComponent: StandardComponent { let windowController: NSWindowController var window: NSWindow { return self.windowController.window! } init(source: Observable, nibName: String) { self.windowController = NSWindowController(windowNibName: nibName) super.init(source: source) } func show() { self.windowController.showWindow(self) } }