diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-01 10:59:36 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2015-04-01 10:59:36 +0200 |
commit | f407e12321dada7470e561cefd576031cd9e4168 (patch) | |
tree | c27aa2f26ae6110d9b46c015a963697c1a7b530c /async/src/async.cpp | |
parent | 08e35aad0b53364fb82e830f1b2e2ceb60658ea5 (diff) | |
download | sink-f407e12321dada7470e561cefd576031cd9e4168.tar.gz sink-f407e12321dada7470e561cefd576031cd9e4168.zip |
dowhile cleanup, second dowhile version without separate condition.
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 | |||