1. collect()

    completion이 방출하기 전까지 모든 이벤트를 어레이로 묶어서 리턴함.

    let numbers = (0...10)
    cancellable = numbers.publisher
        .collect()
        .sink { print("\\($0)") }
    //// Prints: "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
    
    let numbers = (0...10)
    cancellable = numbers.publisher
        .collect(5)
        .sink { print("\\($0), terminator: " "") }
    // Prints "[0, 1, 2, 3, 4] [5, 6, 7, 8, 9] [10] "
    //지정한 개수별로 묶어서 
    
  2. collect(_ strategy: Pulishers.TimeGroupingStrategy<S>, option: S.SchedulerOptions? = nil)

    타이머를 collection 해줌.

    let sub = Timer.publish(every: 1, on: .main, in: .default)
        .autoconnect()
        .collect(.byTime(RunLoop.main, .seconds(5)))
        .sink { print("\\($0)", terminator: "\\n\\n") }
    
    // Prints: "[2020-01-24 00:54:46 +0000, 2020-01-24 00:54:47 +0000,
    //          2020-01-24 00:54:48 +0000, 2020-01-24 00:54:49 +0000,
    //          2020-01-24 00:54:50 +0000]"
    
  3. ignoreOutout()

    struct NoZeroValuesAllowedError: Error {}
    let numbers = [1, 2, 3, 4, 5, 0, 6, 7, 8, 9]
    cancellable = numbers.publisher
        .tryFilter({ anInt in
            guard anInt != 0 else { throw NoZeroValuesAllowedError() }
            return anInt < 20
        })
        .ignoreOutput()
        .sink(receiveCompletion: {print("completion: \\($0)")},
              receiveValue: {print("value \\($0)")})
    
  4. reduect(initalResult, nextPartialResult) ,tryReduce()

    let numbers = (0...10)
    cancellable = numbers.publisher
        .reduce(0, { accum, next in accum + next })
        .sink { print("\\($0)") }
    
    // Prints: "55"