#include "mosh-me/pipeline.hpp" #include #include #include using namespace mosh_me; class CountProducer : public PipeOutput, public AsPipeSource { private: int counter_ = 0; public: std::optional pull() noexcept override { if (auto i = counter_++; i < 10) { return i; } else { return std::nullopt; } } }; class Doubler : public PipeWorker, public AsPipeLink { public: std::optional pull() noexcept override { return fetchInput().and_then( [](int x) { return std::make_optional(x * 2); }); } }; class Multiplier : public PipeWorker, public AsPipeLink { int f_; public: Multiplier(int f) : f_(f) {} std::optional pull() noexcept override { return fetchInput().and_then( [this](int x) { return std::make_optional(f_ * x); }); } }; class Sum2 : public PipeWorker, public AsPipeLink { private: std::optional last_; public: std::optional pull() noexcept override { if (auto x = fetchInput(); x) { if (last_) { auto sum = *last_ + *x; last_ = std::nullopt; return sum; } else { last_ = x; return pull(); } } return std::nullopt; } }; TEST_CASE("Pipeline") { auto pipe = Sum2::link() << Doubler::link() << Multiplier::link(10) << CountProducer::link(); auto count = 0; while (auto s = pipe.pull()) { REQUIRE(*s == ((count * 2) * 20) + ((count * 2 + 1) * 20)); count++; } REQUIRE(count == 5); }