Last active
May 29, 2018 11:16
-
-
Save Sajjon/81b245fc528f6a6cfcac467c9d45f4b3 to your computer and use it in GitHub Desktop.
RxOptional extension mapEmptyToOptional
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import RxOptional | |
public protocol OptionalType { | |
associatedtype OptionalElement | |
var element: OptionalElement? { get } | |
func asOptional() -> OptionalElement? | |
func asNil() -> OptionalElement? | |
} | |
public extension OptionalType { | |
func asOptional() -> OptionalElement? { | |
return element | |
} | |
func asNil() -> OptionalElement? { | |
return nil | |
} | |
} | |
extension Optional: OptionalType {} | |
public extension Optional { | |
public typealias OptionalElement = Wrapped | |
public var element: OptionalElement? { | |
switch self { | |
case .none: return nil | |
case .some(let element): return element | |
} | |
} | |
} | |
public extension ObservableConvertibleType where E: OptionalType, E.OptionalElement: Occupiable { | |
typealias OptionalElement = E.OptionalElement | |
/** | |
Maps empty occupiable elements, to `Nil` | |
- returns: `Observable` of source `Observable`'s occupiable elements, with empty occupiable elements mapped to `Nil` | |
*/ | |
public func mapEmptyToNil() -> Observable<E> { | |
return self.asObservable().flatMapLatest { element -> Observable<E> in | |
let optional = element.asOptional() | |
guard let wrapped = optional, wrapped.isEmpty else { | |
// no need to do anything | |
return Observable<E>.just(element) | |
} | |
let observable = Observable<OptionalElement?>.just(nil) | |
// swiftlint:disable:next force_cast | |
return observable as! Observable<E> | |
} | |
} | |
} | |
public extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy, E: OptionalType, E.OptionalElement: Occupiable { | |
public func mapEmptyToNil() -> Driver<E> { | |
return asObservable().mapEmptyToNil().asDriverOnErrorReturnEmpty() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment