pairwise
각 원소를 그다음 원소와 짝짓습니다. [a, b, c]는 ((a, b), (b, c))가 됩니다.
Iterable<(A, A)> pairwise<A>(Iterable<A> iterable)
FxAsyncIterable<(A, A)> pairwiseAsync<A>(FxAsyncIterable<A> iterable)
Fx<(T, T)> Fx<T>.pairwise() // chain (sync)
FxAsync<(T, T)> FxAsync<T>.pairwise() // chain (async)
FxEvents<(T, T)> FxEvents<T>.pairwise() // chain (events)
강의
"얼마나 변했는가?"라는 질문에는 한 번에 두 원소 — 이전 값과
현재 값 — 가 필요한데, 보통의
map은 언제나 하나만 봅니다. 흔한
우회로는 인덱스 루프(list[i - 1],
off-by-one 위험 포함)이거나, 리스트를 한 칸 밀어 자기 자신과 zip하는
것입니다. pairwise()는 그 아이디어를 연산자로 만든
것입니다. (previous, current) 레코드를 지연 방식으로 내놓으며,
원소 n개에서 쌍 n − 1개가 나옵니다. 원소가
두 개 미만이면 아무것도 내놓지 않습니다 — 만들 쌍이 없기 때문입니다.
레코드 필드가 양쪽을 모두 손 닿는 곳에 둡니다.
p.$2 - p.$1이 증감량이고,
p.$2.compareTo(p.$1)이 방향입니다. 이는 정확히
2원소 리스트 대신 타입이 있는 레코드를 쓰는
windowed(2)입니다 — 이웃의
범위가 둘을 넘어서면 windowed를 쓰세요.
Dart 고유의 추가 기능입니다(FxTS에는 대응물이 없습니다). RxDart의
pairwise를 따랐습니다. 비동기 형태는 pull이 있기 전까지
아무것도 계산하지 않으며
concurrent와 조합됩니다.
데모 1 · 측정값 사이의 증감량
데모 2 · 변화의 방향
직접 해 보기
연습: 타임스탬프 시퀀스에서 빈 간격을 찾아 보세요.