peek
아무것도 바꾸지 않으면서 원소마다 함수를 실행합니다 — 파이프라인판 디버거 중단점입니다.
Iterable<A> peek<A>(void Function(A a) f, Iterable<A> iterable)
FxAsyncIterable<A> peekAsync<A>(FutureOr<void> Function(A a) f, FxAsyncIterable<A> iterable)
Fx<T> Fx.peek(void Function(T a) f) // chain
FxAsync<T> FxAsync.peek(FutureOr<void> Function(T a) f)
강의
peek은 mapEffect의 더 엄격한 사촌입니다.
mapEffect는 값을 바꿀 수도 있지만(사실상 이름만 다른
map입니다), peek의 콜백은
void를 반환합니다 — 오직 들여다보는 것만 허용됩니다.
들어간 원소는 전혀 손대지 않은 채 그대로 나옵니다. 디버깅 중에
파이프라인 한가운데에 print나 지표 수집, 로그 한 줄을
끼워 넣고 싶은데 오타 하나로 데이터가 조용히 바뀌는 사고는 피하고
싶을 때 쓰면 됩니다.
여기 나오는 다른 함수들과 똑같이 지연 평가됩니다. 콜백은 실제로 끌려 나온 원소마다 정확히 한 번씩, 순서대로, 그 이전에는 절대 실행되지 않습니다.
peekAsync는 mapAsync 위에 그대로 얹혀
있으므로(f를 await한 뒤 원래 값을 다시 내보냅니다)
map의 동시성 동작을 그대로 물려받습니다.
.concurrent(n)을 붙이면 콜백 n개가 실제로
병렬로 실행됩니다 — 내부 상태 기계가 순차적일 수밖에 없는
flatMap이나 scan과는 다릅니다.
데모 1 · 기본
들어간 값이 그대로 나옵니다 — peek은 관찰만
합니다:
데모 2 · 비동기, 진짜 동시성으로
직접 해 보기
연습: peek으로 각 가격에 대해
'checking price: $p'를 값은 바꾸지 않은 채 출력한 다음,
fold로 합계를 구해 보세요.
관련 항목:
mapEffect — peek과 비슷하지만 변환할 수 있습니다 ·
map — 원소마다 변환합니다 ·
pluck — 각 맵에서 필드 하나를 뽑아냅니다 ·
concurrent — 병렬 평가