Concepts
struct observable {
void bind(observer);
};
struct observer {
template<class T>
void next(T);
};
struct lifter {
observer lift(observer);
};
Doesn't work, just saving thoughts for later
const auto buffer_until = [](observable signal){
auto queue = make_shared<std::queue>();
make_lifter([=](auto r){
signal.bind(make_observer(r, [=](auto& r, auto v){
while (queue->front() < v) r.next(queue->pop());
});
return make_observer([=](auto&, auto v){
q->push(v);
});
});
};