Да scan
- это оператор, которого вы ищете:
let stream = Observable<Int>.from([1, 2, 3, 4, 5, 6, 3, 4, 5, 1])
let seed = (0, 0) // (any Int, Int that smaller of all possible values of first emited Int)
let wrongPairs = stream
.scan(seed) { last, new -> (Int, Int) in
return (last.1, new)
}
.filter { $0.0 > $0.1 }
С помощью scan
мы отображаем поток Int
s в поток пар Int
, а затем фильтруем все "хорошие" пары"(предыдущий элемент, если он меньше или равен):
-1-2-3-4-5-6-3-4-5-1-
-(0, 1)-(1, 2)-(2, 3)-(3, 4)-(4, 5)-(5, 6)-(6, 3)-(3, 4)-(4, 5)-(5, 1)-
-(6, 3)-(5, 1)-
Недостаток scan
в том, что вам нужно начальное число для начала, что может быть проблематично в некоторых случаях, но если ваш поток всегда выдает положительные числа -1
будет работать.