feat(pipe): use pipe status propagation
This commit is contained in:
@@ -5,59 +5,55 @@
|
||||
|
||||
using namespace mosh_me;
|
||||
|
||||
class CountProducer : public PipeOutput<int>,
|
||||
public AsPipeSource<CountProducer, int> {
|
||||
class CountProducer : public AsPipeSource<CountProducer, int> {
|
||||
private:
|
||||
int counter_ = 0;
|
||||
|
||||
public:
|
||||
std::optional<int> pull() noexcept override {
|
||||
PipeData<int> pull() noexcept override {
|
||||
if (auto i = counter_++; i < 10) {
|
||||
return i;
|
||||
} else {
|
||||
return std::nullopt;
|
||||
return std::unexpected(PipeStatus::PIPE_EOF);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class Doubler : public PipeWorker<int, int>,
|
||||
public AsPipeLink<Doubler, int, int> {
|
||||
class Doubler : public AsPipeLink<Doubler, int, int> {
|
||||
public:
|
||||
std::optional<int> pull() noexcept override {
|
||||
return fetchInput().and_then(
|
||||
[](int x) { return std::make_optional(x * 2); });
|
||||
PipeData<int> pull() noexcept override {
|
||||
return fetchInput().and_then([](int x) -> PipeData<int> { return x * 2; });
|
||||
}
|
||||
};
|
||||
|
||||
class Multiplier : public PipeWorker<int, int>,
|
||||
public AsPipeLink<Multiplier, int, int> {
|
||||
class Multiplier : public AsPipeLink<Multiplier, int, int> {
|
||||
int f_;
|
||||
|
||||
public:
|
||||
Multiplier(int f) : f_(f) {}
|
||||
std::optional<int> pull() noexcept override {
|
||||
PipeData<int> pull() noexcept override {
|
||||
return fetchInput().and_then(
|
||||
[this](int x) { return std::make_optional(f_ * x); });
|
||||
[this](int x) -> PipeData<int> { return f_ * x; });
|
||||
}
|
||||
};
|
||||
|
||||
class Sum2 : public PipeWorker<int, int>, public AsPipeLink<Sum2, int, int> {
|
||||
class Sum2 : public AsPipeLink<Sum2, int, int> {
|
||||
private:
|
||||
std::optional<int> last_;
|
||||
|
||||
public:
|
||||
std::optional<int> pull() noexcept override {
|
||||
PipeData<int> pull() noexcept override {
|
||||
if (auto x = fetchInput(); x) {
|
||||
if (last_) {
|
||||
auto sum = *last_ + *x;
|
||||
last_ = std::nullopt;
|
||||
return sum;
|
||||
} else {
|
||||
last_ = x;
|
||||
last_ = *x;
|
||||
return pull();
|
||||
}
|
||||
}
|
||||
return std::nullopt;
|
||||
return std::unexpected(PipeStatus::PIPE_EOF);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user