dropWhileRight

소스 에서 술어가 참인 가장 긴 구간을 버립니다 — 꼬리를 잘라내는 연산입니다.

Iterable<A> dropWhileRight<A>(bool Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> dropWhileRightAsync<A>(bool Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.dropWhileRight(bool Function(T a) f) // chain FxAsync<T> FxAsync.dropWhileRight(bool Function(T a) f)

강의

잘라내기(trim) 연산자입니다. 뒤에 붙은 0들, 뒤에 남은 빈 줄, 꼬리에 깔린 자리표시자 행 — 길이를 미리 세지 않고 끝에서 걷어내고 싶을 때 씁니다. dropRight로는 개수를 알아야만 할 수 있는 일입니다.

끝까지 이어지는 구간만 버립니다. 소스 중간에 있는 구간은 접미사가 아니므로 그 자리에 그대로 남습니다 — 직관과 한 번 대조해 볼 만한 지점입니다. filterreject였다면 그것까지 지웠을 테니까요.

takeWhileRight와 달리 이쪽은 흘려보냅니다. 조건에 맞는 구간은 접미사일 가능성이 있으므로 내보내지 않고 붙들어 두었다가, 술어에서 떨어지는 첫 원소가 나타나 그 구간이 접미사가 아니었음을 증명하는 순간 한꺼번에 풀어놓습니다. 그래서 메모리 비용은 소스 길이가 아니라 가장 긴 구간의 길이이고, 소스가 열려 있는 동안 값이 계속 흐릅니다.

List라면 끝에서부터 거꾸로 훑어 구간을 찾으므로 술어는 그 구간만 보게 되고, 그 밖의 소스라면 모든 원소를 순서대로 검사합니다. 술어는 순수하게 유지하세요.

데모 1 · 기본

데모 2 · 비동기, 그리고 분할

직접 해 보기

연습: 뒤에 붙은 0들을 잘라내고 나머지를 남겨 보세요.

관련 항목: takeWhileRight — 같은 구간을 남기는 반대편 · dropRight — 개수로 잘라내는 뒤쪽 구간 · skipWhile — 같은 발상을 앞에서 · whereNot — 끝이 아니라 어디서든 맞는 값을 지웁니다