summaryrefslogtreecommitdiffstats
path: root/async/src/async.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'async/src/async.cpp')
-rw-r--r--async/src/async.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/async/src/async.cpp b/async/src/async.cpp
index 6eefd1b..20ba4e6 100644
--- a/async/src/async.cpp
+++ b/async/src/async.cpp
@@ -47,3 +47,43 @@ JobBase::~JobBase()
47{ 47{
48} 48}
49 49
50static void asyncWhile(const std::function<void(std::function<void(bool)>)> &body, const std::function<void()> &completionHandler) {
51 body([body, completionHandler](bool complete) {
52 if (complete) {
53 completionHandler();
54 } else {
55 asyncWhile(body, completionHandler);
56 }
57 });
58}
59
60Job<void> Async::dowhile(Condition condition, ThenTask<void> body)
61{
62 return Async::start<void>([body, condition](Async::Future<void> &future) {
63 asyncWhile([condition, body](std::function<void(bool)> whileCallback) {
64 Async::start<void>(body).then<void>([whileCallback, condition]() {
65 whileCallback(!condition());
66 }).exec();
67 },
68 [&future]() { //while complete
69 future.setFinished();
70 });
71 });
72}
73
74Job<void> Async::dowhile(ThenTask<bool> body)
75{
76 return Async::start<void>([body](Async::Future<void> &future) {
77 asyncWhile([body](std::function<void(bool)> whileCallback) {
78 Async::start<bool>(body).then<bool, bool>([whileCallback](bool result) {
79 whileCallback(!result);
80 //FIXME this return value is only required because .then<bool, void> doesn't work
81 return true;
82 }).exec();
83 },
84 [&future]() { //while complete
85 future.setFinished();
86 });
87 });
88}
89