windowed

연속된 원소 size개짜리 슬라이딩 윈도우로, 각 윈도우는 직전 윈도우보다 step개 뒤에서 시작합니다.

Iterable<List<A>> windowed<A>(int size, Iterable<A> iterable, {int step = 1, bool partial = false}) FxAsyncIterable<List<A>> windowedAsync<A>(int size, FxAsyncIterable<A> iterable, {int step = 1, bool partial = false}) Fx<List<T>> Fx<T>.windowed(int size, {int step = 1, bool partial = false}) // chain (sync) FxAsync<List<T>> FxAsync<T>.windowed(int size, {int step = 1, bool partial = false}) // chain (async)

강의

chunk는 시퀀스를 겹치지 않는 조각으로 자릅니다. 조각이 겹쳐야 하는 순간 — 이동 평균, "한도를 넘긴 연속 세 번의 측정값", 각 원소를 이웃과 함께 보는 모든 질문 — 경계를 조심스레 따지는 인덱스 루프를 손으로 짜게 됩니다. windowed(size)는 그 루프를 지연 연산자로 만든 것입니다. 연속된 원소 size개씩을 담은 List를 내놓으며, 윈도우 사이는 step(기본값 1)만큼 앞으로 미끄러집니다.

두 개의 손잡이로 온 가족을 커버합니다. step은 윈도우의 간격을 정합니다. step < size는 서로 겹치게, step == sizechunk와 똑같이 타일처럼 깔리게, step > size는 사이를 띄워 샘플링하게 만듭니다. partial: true는 꼬리의 짧은 윈도우를 버리는 대신 남겨 둡니다 — 실제로 chunk(n)바로 windowed(n, step: n, partial: true)이며, 둘은 하나의 구현을 공유합니다.

Dart 고유의 추가 기능입니다(FxTS에는 대응물이 없습니다) — 이름은 Kotlin의 windowed에서 왔고, RxDart 독자에게는 bufferCount(size, startEvery)로 익숙할 것입니다. 다른 모든 fxdart 연산자처럼 지연 평가됩니다. 윈도우는 pull 한 번에 하나씩 구체화되므로, 끝없는 소스와도 concurrent와도 잘 조합됩니다.

데모 1 · 이동 평균

데모 2 · step과 partial 손잡이

직접 해 보기

연습: 지출 한도를 넘긴 3일 연속 구간을 찾아 표시해 보세요.

관련 항목: chunk — 겹치지 않는 특수 사례 · pairwise — 정확히 2개짜리 윈도우, 레코드 형태 · scan — 고정 윈도우 없이 누적 상태 유지