From c2b0a03a46ddb1aacd901b71d036656f5ba3c67f Mon Sep 17 00:00:00 2001 From: ivanjermakov Date: Tue, 9 Apr 2024 22:16:38 +0200 Subject: [PATCH] Std: `Iter::takeWhile` --- src/std/iter/mod.no | 1 + src/std/iter/takeWhile.no | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/std/iter/takeWhile.no diff --git a/src/std/iter/mod.no b/src/std/iter/mod.no index ca1a4a09..d6bf7cc7 100644 --- a/src/std/iter/mod.no +++ b/src/std/iter/mod.no @@ -2,6 +2,7 @@ pub use std::iter::{ intersperseIter::{ IntersperseIter, IntersperseAdapter }, mapIter::{ MapIter, MapAdapter }, peekable::{ PeekableIter, PeekableAdapter }, + takeWhile::{ TakeWhileIter, TakeWhileAdapter }, } pub trait Iterable { diff --git a/src/std/iter/takeWhile.no b/src/std/iter/takeWhile.no new file mode 100644 index 00000000..7731cd4d --- /dev/null +++ b/src/std/iter/takeWhile.no @@ -0,0 +1,32 @@ +pub type TakeWhileIter( + iter: Iter, + f: |T|: Bool, + done: Bool +) + +impl Iter for TakeWhileIter { + fn next(self): Option { + if self.done { return None() } + match self.iter.next() { + Some(value) { + if (self.f)(value).not() { + self.done = true + return None() + } + Some(value) + } + _ { None() } + } + } +} + +pub trait TakeWhileAdapter { + fn takeWhile(self, f: |T|: Bool): Iter +} + +impl TakeWhileAdapter for Iter { + fn takeWhile(self, f: |T|: Bool): Iter { + TakeWhileIter(iter: self, f, false) + } +} +