1. filter : 조건에 true를 리턴하는 요소들만 방출함.

let numbers: [Int] = [1, 2, 3, 4, 5]
cancellable = numbers.publisher
    .filter { $0 % 2 == 0 }
    .sink { print("\\($0)", terminator: " ") }

// Prints: "2 4"

2. tryFilter : 에러를 방출할 수 있는 필터

3. compactMap 옵셔널을 해제하여 방출함. nil은 필터링됨.

let numbers = (0...5)
let romanNumeralDict: [Int : String] =
    [1: "I", 2: "II", 3: "III", 5: "V"]

cancellable = numbers.publisher
    .compactMap { romanNumeralDict[$0] }
    .sink { print("\\($0)", terminator: " ") }

// Prints: "I II III V"

4. tryCompactMap : 에러방출가능한 compactMap

5. removeDuplicates 중복을 제거하여 이벤트 방출

let numbers = [0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0]
cancellable = numbers.publisher
    .removeDuplicates()
    .sink { print("\\($0)", terminator: " ") }

// Prints: "0 1 2 3 4 0"
// input, output이 equatable 준수할경우에 가능함.
//이전과 비교해 같으면 무시함.

6. removeDuplicates(by:), tryRemoveDuplicateds(by:)

equatable프르토콜을 체택하지 않은 객체의 중복을 검사하기위해 클로저를 직접 구현함.

struct Point {
    let x: Int
    let y: Int
}

let points = [Point(x: 0, y: 0), Point(x: 0, y: 1),
              Point(x: 1, y: 1), Point(x: 2, y: 1)]
cancellable = points.publisher
    .removeDuplicates { prev, current in
        // Considers points to be duplicate if the x coordinate
        // is equal, and ignores the y coordinate
        prev.x == current.x
    }
    .sink { print("\\($0)", terminator: " ") }

// Prints: Point(x: 0, y: 0) Point(x: 1, y: 1) Point(x: 2, y: 1)

7. replaceEmpty(with:)

퍼블리셔가 아무런 엘리멘트도 방출하지 않을경우 작동함.

let numbers: [Double] = []
cancellable = numbers.publisher
    .replaceEmpty(with: Double.nan)
    .sink { print("\\($0)", terminator: " ") }

// Prints "(nan)".

let otherNumbers: [Double] = [1.0, 2.0, 3.0]
cancellable2 = otherNumbers.publisher
    .replaceEmpty(with: Double.nan)
    .sink { print("\\($0)", terminator: " ") }

// Prints: 1.0 2.0 3.0

8. replaceError(with)

에러를 일반적인 요소로 치환해줌.

struct MyError: Error {}
let fail = Fail<String, MyError>(error: MyError())
cancellable = fail
    .replaceError(with: "(replacement element)")
    .sink(
        receiveCompletion: { print ("\\($0)") },
        receiveValue: { print ("\\($0)", terminator: " ") }
    )

// Prints: "(replacement element) finished".