Publisher.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import Combine
  2. protocol OptionalType {
  3. associatedtype Wrapped
  4. var optional: Wrapped? { get }
  5. }
  6. extension Optional: OptionalType {
  7. public var optional: Wrapped? { self }
  8. }
  9. extension Publisher where Output: OptionalType {
  10. func ignoreNil() -> AnyPublisher<Output.Wrapped, Failure> {
  11. flatMap { output -> AnyPublisher<Output.Wrapped, Failure> in
  12. guard let output = output.optional else {
  13. return Empty<Output.Wrapped, Failure>(completeImmediately: false).eraseToAnyPublisher()
  14. }
  15. return Just(output).setFailureType(to: Failure.self).eraseToAnyPublisher()
  16. }
  17. .eraseToAnyPublisher()
  18. }
  19. }
  20. extension Publisher {
  21. func combineWithPrevious() -> AnyPublisher<(Output, Output), Failure> {
  22. zip(dropFirst()).eraseToAnyPublisher()
  23. }
  24. }
  25. extension Publisher {
  26. func cancellable() -> some Cancellable {
  27. sink { _ in } receiveValue: { _ in }
  28. }
  29. }
  30. extension Publisher where Failure == Never {
  31. func cancellable() -> some Cancellable {
  32. sink { _ in }
  33. }
  34. }
  35. typealias Lifetime = Set<AnyCancellable>
  36. extension Publisher where Failure == Never {
  37. func weakAssign<T: AnyObject>(
  38. to keyPath: ReferenceWritableKeyPath<T, Output>,
  39. on object: T
  40. ) -> AnyCancellable {
  41. sink { [weak object] value in
  42. object?[keyPath: keyPath] = value
  43. }
  44. }
  45. }