Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rxSwift extension for converting Single<[Element]> to Observable<Element>

I'm having a real hard time trying to create an extension that converts a Single array to an Observable. So for example I have a Single<[Address]> and I want to convert it to an Observable<Address>.

The code I have to write each time I want to do this is

mySingleVariable.asObservable().flatMap({ addresses in Observable.from(addresses) })

This operation is very common and the code is quite verbose. My attempt to create an extension looks like the following

extension PrimitiveSequence where Trait == SingleTrait {
    func flatObservable<R: Collection>() -> Observable<R.Element> {
        return asObservable().flatMap({ element in Observable.from(element) })
    }
}

The code above unfortunately does not work. The error I get is "Generic parameter 'R' is not used in function signature". This is because the function returns Observable<R.Element>. If it were to return Observable<R>, the error would go away, but it's not the result I'm trying to achieve.

like image 549
andrei Avatar asked Sep 06 '25 14:09

andrei


1 Answers

Try this:

extension PrimitiveSequence where Trait == SingleTrait, Element: Sequence {

    func flatObservable<R>() -> Observable<R> where R == Element.Element {
        return asObservable().flatMap { Observable.from($0) }
    }
}
like image 180
Daniel T. Avatar answered Sep 09 '25 21:09

Daniel T.