Skip to content

Commit 8ae072a

Browse files
committed
Added drop_while/take_while
1 parent f7a0033 commit 8ae072a

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# fpgen
22
*Functional programming in C++ using C++20 coroutines*
3-
![](https://img.shields.io/badge/test_coverage-98%25-brightgreen)
3+
![](https://img.shields.io/badge/test_coverage-97%25-brightgreen)
44

55

66
## Aim

inc/manipulators.hpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,34 @@ template <typename T> generator<T> take(generator<T> gen, size_t count) {
9696
}
9797
co_return;
9898
}
99+
100+
template <typename T, typename Pred>
101+
generator<T> drop_while(generator<T> gen, Pred p) {
102+
while (gen) {
103+
T temp = gen();
104+
if (!p(temp)) {
105+
co_yield temp;
106+
break;
107+
}
108+
}
109+
110+
while (gen) {
111+
co_yield gen();
112+
}
113+
co_return;
114+
}
115+
116+
template <typename T, typename Pred>
117+
generator<T> take_while(generator<T> gen, Pred p) {
118+
while (gen) {
119+
T val = gen();
120+
if (!p(val)) {
121+
break;
122+
}
123+
co_yield val;
124+
}
125+
co_return;
126+
}
99127
} // namespace fpgen
100128

101129
#endif

test/src/test_manip.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,41 @@ TEST(manipulators, drop_take) {
184184
}
185185
SUCCEED();
186186
}
187+
188+
TEST(manipulators, drop_while_empty) {
189+
auto gen = drop_while(manip_empty(), [](size_t v) { return v > 3; });
190+
for (auto v : gen) {
191+
FAIL() << "should not return a value";
192+
}
193+
SUCCEED();
194+
}
195+
196+
TEST(manipulators, drop_while_normal) {
197+
auto gen = drop_while(until12(), [](size_t v) { return v < 5; });
198+
size_t exp = 5;
199+
for (auto v : gen) {
200+
EXPECT_EQ(v, exp);
201+
EXPECT_TRUE(exp <= 12);
202+
exp++;
203+
}
204+
EXPECT_EQ(exp, 13);
205+
}
206+
207+
TEST(manipulators, take_while_empty) {
208+
auto gen = take_while(manip_empty(), [](size_t v) { return v < 4; });
209+
for (auto v : gen) {
210+
FAIL() << "should not return a value";
211+
}
212+
SUCCEED();
213+
}
214+
215+
TEST(manipulators, take_while_normal) {
216+
auto gen = take_while(fpgen::inc((size_t)0), [](size_t v) { return v < 8; });
217+
size_t exp = 0;
218+
for (auto v : gen) {
219+
EXPECT_EQ(v, exp);
220+
EXPECT_TRUE(exp <= 8);
221+
exp++;
222+
}
223+
EXPECT_EQ(exp, 8);
224+
}

0 commit comments

Comments
 (0)