Observable+Occupiable.swift 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import Foundation
  2. import RxSwift
  3. public extension ObservableType where Element: Occupiable {
  4. /**
  5. Filter out empty occupiable elements.
  6. - returns: `Observable` of source `Observable`'s occupiable elements, with empty occupiable elements filtered out.
  7. */
  8. func filterEmpty() -> Observable<Element> {
  9. return self.flatMap { element -> Observable<Element> in
  10. guard element.isNotEmpty else {
  11. return Observable<Element>.empty()
  12. }
  13. return Observable<Element>.just(element)
  14. }
  15. }
  16. /**
  17. Replaces empty occupiable elements with result returned by `handler`.
  18. - parameter handler: empty handler throwing function that returns `Observable` of non-empty occupiable elements.
  19. - returns: `Observable` of the source `Observable`'s occupiable elements, with empty occupiable elements replaced by the handler's returned non-empty occupiable elements.
  20. */
  21. func catchOnEmpty(_ handler: @escaping () throws -> Observable<Element>) -> Observable<Element> {
  22. return self.flatMap { element -> Observable<Element> in
  23. guard element.isNotEmpty else {
  24. return try handler()
  25. }
  26. return Observable<Element>.just(element)
  27. }
  28. }
  29. /**
  30. Throws an error if the source `Observable` contains an empty occupiable element; otherwise returns original source `Observable` of non-empty occupiable elements.
  31. - parameter error: error to throw when an empty occupiable element is encountered. Defaults to `RxOptionalError.EmptyOccupiable`.
  32. - throws: `error` if an empty occupiable element is encountered.
  33. - returns: original source `Observable` of non-empty occupiable elements if it contains no empty occupiable elements.
  34. */
  35. func errorOnEmpty(_ error: Error = RxOptionalError.emptyOccupiable(Element.self)) -> Observable<Element> {
  36. return self.map { element in
  37. guard element.isNotEmpty else {
  38. throw error
  39. }
  40. return element
  41. }
  42. }
  43. }