import Combine protocol OptionalType { associatedtype Wrapped var optional: Wrapped? { get } } extension Optional: OptionalType { public var optional: Wrapped? { self } } extension Publisher where Output: OptionalType { func ignoreNil() -> AnyPublisher { flatMap { output -> AnyPublisher in guard let output = output.optional else { return Empty(completeImmediately: false).eraseToAnyPublisher() } return Just(output).setFailureType(to: Failure.self).eraseToAnyPublisher() } .eraseToAnyPublisher() } } extension Publisher { func combineWithPrevious() -> AnyPublisher<(Output, Output), Failure> { zip(dropFirst()).eraseToAnyPublisher() } }