import RxSwift extension PrimitiveSequence where Trait == CompletableTrait, Element == Never { public func asMaybe() -> Maybe { return Maybe.create { maybe in return self.subscribe( onCompleted: { maybe(.completed) }, onError: { error in maybe(.error(error)) }) } } } extension PrimitiveSequence where Trait == MaybeTrait { public func asSingle() -> Single { return Single.create { single in return self.subscribe( onSuccess: { element in single(.success(element)) }, onError: { error in single(.error(error)) }, onCompleted: { single(.error(RxError.noElements)) }) } } public func asCompletable() -> Completable { return Completable.create { completable in return self.subscribe( onSuccess: { _ in completable(.completed) }, onError: { error in completable(.error(error)) }, onCompleted: { completable(.completed) }) } } public func flatMapCompletable(selector: @escaping (Element) throws -> Completable) -> Completable { return self.flatMap { try selector($0).asMaybe() }.asCompletable() } public func ifEmpty(switchTo other: Maybe) -> Maybe { return asObservable().ifEmpty(switchTo: other.asObservable()).asMaybe() } public func ifEmpty(default: Element) -> Maybe { return asObservable().ifEmpty(default: `default`).asMaybe() } public var isEmpty: Single { let disposeBag = DisposeBag() var result = Single.just(true) asObservable() .map({ (value) in result = Single.just(false) }) .subscribe() .addDisposableTo(disposeBag) return result } } extension PrimitiveSequence where Trait == SingleTrait { public func asMaybe() -> Maybe { return Maybe.create { maybe in return self.subscribe( onSuccess: { element in maybe(.success(element)) }, onError: { error in maybe(.error(error)) }) } } public func asCompletable() -> Completable { return Completable.create { completable in return self.subscribe( onSuccess: { _ in completable(.completed) }, onError: { error in completable(.error(error)) }) } } public func compose(_ block: ((Single) -> Single)) -> Single { return block(self) } public func flatMapCompletable(selector: @escaping (Element) throws -> Completable) -> Completable { return self.asMaybe().flatMap { try selector($0).asMaybe() }.asCompletable() } public func asOptional() -> Element? { var result: Element? = nil let disposeBag = DisposeBag() asObservable() .map { (value) in result = value } .subscribe() .addDisposableTo(disposeBag) return result } } extension Observable { public func compose(_ block: ((Observable) -> Observable)) -> Observable { return block(self) } }