// TJP COPYRIGHT HEADER // // Timer.h // algorithm // // Created by Timothy Prepscius on 1/19/18. // Copyright © 2018 Timothy Prepscius. All rights reserved. // #pragma once #include "Scheduler.h" #include #include #include #include "Time.h" namespace timprepscius::core::time { template Future Scheduler::schedule(Duration period, F &&f) { Promise v; auto event = schedule( period, false, [v, f=std::move(f)]() { auto r = v; r.consume(f); } ); return v.get_future().then([event](auto &&f) { return f.get(); }); } // this should be rewritten to use the above "after", should be much simpler template Future Scheduler::schedule_future(Duration period, F &&f_) { auto v = PromiseOfFutures::generate(); auto execute = Promise(); v->add( execute.get_future().then( [v_=weak(v), f=std::move(f_)](auto &&) { if (auto v = strong(v_)) { v->add( f().then( [v_](auto &&r) { if (auto v = strong(v_)) v->consume(r); } ) ); } } ) ); auto event = schedule( period, false, [execute]() { auto execute_ = execute; execute_.set_value(); } ); return v->get_future().then([event](auto &&f) { return f.get(); }); } template Future Scheduler::schedule(F &&f) { return schedule(Immediate, std::forward(f)); } template Future Scheduler::schedule_future(F &&f) { return schedule_future(Immediate, std::forward(f)); } template void Scheduler::run(F &&f) { return schedule(std::forward(f)).wait(); } } // namespace