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)

강의

peekmapEffect의 더 엄격한 사촌입니다. mapEffect는 값을 바꿀 수도 있지만(사실상 이름만 다른 map입니다), peek의 콜백은 void를 반환합니다 — 오직 들여다보는 것만 허용됩니다. 들어간 원소는 전혀 손대지 않은 채 그대로 나옵니다. 디버깅 중에 파이프라인 한가운데에 print나 지표 수집, 로그 한 줄을 끼워 넣고 싶은데 오타 하나로 데이터가 조용히 바뀌는 사고는 피하고 싶을 때 쓰면 됩니다.

여기 나오는 다른 함수들과 똑같이 지연 평가됩니다. 콜백은 실제로 끌려 나온 원소마다 정확히 한 번씩, 순서대로, 그 이전에는 절대 실행되지 않습니다.

peekAsyncmapAsync 위에 그대로 얹혀 있으므로(f를 await한 뒤 원래 값을 다시 내보냅니다) map의 동시성 동작을 그대로 물려받습니다. .concurrent(n)을 붙이면 콜백 n개가 실제로 병렬로 실행됩니다 — 내부 상태 기계가 순차적일 수밖에 없는 flatMap이나 scan과는 다릅니다.

데모 1 · 기본

들어간 값이 그대로 나옵니다 — peek은 관찰만 합니다:

데모 2 · 비동기, 진짜 동시성으로

직접 해 보기

연습: peek으로 각 가격에 대해 'checking price: $p'를 값은 바꾸지 않은 채 출력한 다음, fold로 합계를 구해 보세요.

관련 항목: mapEffect — peek과 비슷하지만 변환할 수 있습니다 · map — 원소마다 변환합니다 · pluck — 각 맵에서 필드 하나를 뽑아냅니다 · concurrent — 병렬 평가