diff options
Diffstat (limited to 'async/src/async.cpp')
-rw-r--r-- | async/src/async.cpp | 40 |
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 | ||
50 | static 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 | |||
60 | Job<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 | |||
74 | Job<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 | |||