5f16f2 | 2016-11-05 | Martin Nilsson | | #pike __REAL_VERSION__
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
|
31dd44 | 2016-06-15 | Henrik Grubbström (Grubba) | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | protected enum State {
STATE_PENDING = 0,
STATE_FULFILLED,
STATE_REJECTED,
};
protected Thread.Mutex mux = Thread.Mutex();
protected Thread.Condition cond = Thread.Condition();
|
7affa1 | 2017-02-24 | Martin Nilsson | |
|
c76f64 | 2017-02-24 | Martin Nilsson | | void on_failure(function(mixed : void) f)
|
7affa1 | 2017-02-24 | Martin Nilsson | | {
global_on_failure = f;
}
|
c76f64 | 2017-02-24 | Martin Nilsson | | protected function(mixed : void) global_on_failure;
|
7affa1 | 2017-02-24 | Martin Nilsson | |
|
76c614 | 2017-11-28 | Stephen R. van den Berg | |
|
d4eb91 | 2017-11-28 | Stephen R. van den Berg | |
|
1ade4d | 2017-12-06 | Stephen R. van den Berg | |
|
d4eb91 | 2017-11-28 | Stephen R. van den Berg | |
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | final void use_backend(int enable)
{
callout = enable ? call_out : callnow;
|
1ade4d | 2017-12-06 | Stephen R. van den Berg | | remove_call_out(auto_use_backend);
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | }
private mixed
callnow(function(mixed ...:void) f, int|float delay, mixed ... args)
{
|
d813ed | 2017-11-30 | Stephen R. van den Berg | | mixed err = catch (f(@args));
if (err)
master()->handle_error(err);
return 0;
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | }
|
1ade4d | 2017-12-06 | Stephen R. van den Berg | | private void auto_use_backend()
{
callout = call_out;
}
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | protected function(function(mixed ...:void), int|float, mixed ...:mixed)
|
1ade4d | 2017-12-06 | Stephen R. van den Berg | | callout;
private void create()
{
callout = callnow;
call_out(auto_use_backend, 0);
}
|
76c614 | 2017-11-28 | Stephen R. van den Berg | |
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
class Future
{
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | | mixed result;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | State state;
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | protected array(array(function(mixed, mixed ...: void)|mixed))
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | | success_cbs = ({});
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | protected array(array(function(mixed, mixed ...: void)|mixed))
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | | failure_cbs = ({});
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
mixed get()
{
State s = state;
mixed res = result;
if (!s) {
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | Thread.MutexKey key = mux->lock();
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | while (!state) {
cond->wait(key);
}
s = state;
res = result;
}
if (s == STATE_REJECTED) {
throw(res);
}
return res;
}
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
47c311 | 2016-05-10 | Pontus Östlund | | this_program on_success(function(mixed, mixed ... : void) cb, mixed ... extra)
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | {
|
0831fe | 2017-11-28 | Stephen R. van den Berg | | switch (state) {
case STATE_FULFILLED:
callout(cb, 0, result, @extra);
break;
case STATE_PENDING:
success_cbs += ({ ({ cb, @extra }) });
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
079bac | 2017-11-25 | Stephen R. van den Berg | | return this_program::this;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
47c311 | 2016-05-10 | Pontus Östlund | | this_program on_failure(function(mixed, mixed ... : void) cb, mixed ... extra)
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | {
|
0831fe | 2017-11-28 | Stephen R. van den Berg | | switch (state) {
case STATE_REJECTED:
callout(cb, 0, result, @extra);
break;
case STATE_PENDING:
failure_cbs += ({ ({ cb, @extra }) });
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
079bac | 2017-11-25 | Stephen R. van den Berg | | return this_program::this;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
protected void apply(mixed val, Promise p,
function(mixed, mixed ... : mixed) fun,
array(mixed) ctx)
{
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | | mixed f;
if (mixed err = catch (f = fun(val, @ctx)))
p->failure(err);
else
p->success(f);
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | }
protected void apply_flat(mixed val, Promise p,
function(mixed, mixed ... : Future) fun,
array(mixed) ctx)
{
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | | Future f;
{
if (mixed err = catch (f = fun(val, @ctx))) {
p->failure(err);
return;
}
}
if (!objectp(f) || !f->on_failure || !f->on_success)
error("Expected %O to return a Future. Got: %O.\n", fun, f);
f->on_failure(p->failure)->on_success(p->success);
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | }
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
protected void apply_smart(mixed val, Promise p,
function(mixed, mixed ... : mixed|Future) fun,
array(mixed) ctx)
{
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | | mixed|Future f;
{
if (mixed err = catch (f = fun(val, @ctx))) {
p->failure(err);
return;
}
}
if (!objectp(f)
|| !functionp(f->on_failure) || !functionp(f->on_success))
p->success(f);
else
f->on_failure(p->failure)->on_success(p->success);
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | | }
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | protected void apply_filter(mixed val, Promise p,
function(mixed, mixed ... : int(0..1)) fun,
array(mixed) ctx)
{
|
cd53d2 | 2017-12-04 | Stephen R. van den Berg | | int bool;
mixed err;
if (!(err = catch (bool = fun(val, @ctx))) && bool)
p->success(val);
else
p->failure(err);
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | }
|
6b266a | 2017-12-04 | Stephen R. van den Berg | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
079bac | 2017-11-25 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | this_program map(function(mixed, mixed ... : mixed) fun, mixed ... extra)
{
Promise p = Promise();
on_failure(p->failure);
on_success(apply, p, fun, extra);
return p->future();
}
|
6b266a | 2017-12-04 | Stephen R. van den Berg | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
079bac | 2017-11-25 | Stephen R. van den Berg | |
this_program map_with(function(mixed, mixed ... : this_program) fun,
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | mixed ... extra)
{
Promise p = Promise();
on_failure(p->failure);
on_success(apply_flat, p, fun, extra);
return p->future();
}
|
079bac | 2017-11-25 | Stephen R. van den Berg | |
inline this_program flat_map(function(mixed, mixed ... : this_program) fun,
mixed ... extra)
{
return map_with(fun, @extra);
}
|
6b266a | 2017-12-04 | Stephen R. van den Berg | |
|
9e94d7 | 2017-11-24 | Stephen R. van den Berg | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
9e94d7 | 2017-11-24 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | this_program recover(function(mixed, mixed ... : mixed) fun,
mixed ... extra)
{
Promise p = Promise();
on_success(p->success);
on_failure(apply, p, fun, extra);
return p->future();
}
|
6b266a | 2017-12-04 | Stephen R. van den Berg | |
|
9e94d7 | 2017-11-24 | Stephen R. van den Berg | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
9e94d7 | 2017-11-24 | Stephen R. van den Berg | |
|
079bac | 2017-11-25 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | this_program recover_with(function(mixed, mixed ... : this_program) fun,
mixed ... extra)
{
Promise p = Promise();
on_success(p->success);
on_failure(apply_flat, p, fun, extra);
return p->future();
}
|
0a86c9 | 2017-12-04 | Stephen R. van den Berg | |
|
bab45d | 2017-12-04 | Stephen R. van den Berg | |
|
0a86c9 | 2017-12-04 | Stephen R. van den Berg | |
|
bab45d | 2017-12-04 | Stephen R. van den Berg | |
|
0a86c9 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | this_program filter(function(mixed, mixed ... : int(0..1)) fun,
mixed ... extra)
{
Promise p = Promise();
on_failure(p->failure);
on_success(apply_filter, p, fun, extra);
return p->future();
}
|
0a86c9 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
9e94d7 | 2017-11-24 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | this_program transform(function(mixed, mixed ... : mixed) success,
function(mixed, mixed ... : mixed)|void failure,
mixed ... extra)
{
Promise p = Promise();
on_success(apply, p, success, extra);
on_failure(apply, p, failure || success, extra);
return p->future();
}
|
0a86c9 | 2017-12-04 | Stephen R. van den Berg | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
8d71e6 | 2017-12-04 | Stephen R. van den Berg | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
079bac | 2017-11-25 | Stephen R. van den Berg | |
|
cf8af8 | 2017-11-24 | Stephen R. van den Berg | | this_program transform_with(function(mixed, mixed ... : this_program) success,
function(mixed, mixed ... : this_program)|void failure,
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | | mixed ... extra)
{
Promise p = Promise();
on_success(apply_flat, p, success, extra);
on_failure(apply_flat, p, failure || success, extra);
return p->future();
}
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
30697c | 2017-12-04 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
30697c | 2017-12-04 | Stephen R. van den Berg | |
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
30697c | 2017-12-04 | Stephen R. van den Berg | |
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
30697c | 2017-12-04 | Stephen R. van den Berg | | this_program zip(array(this_program) others)
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | {
|
ae447a | 2017-11-27 | Martin Nilsson | | if (sizeof(others))
return results(({ this_program::this }) + others);
return this_program::this;
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | }
|
30697c | 2017-12-04 | Stephen R. van den Berg | | inline variant this_program zip(this_program ... others)
{
return zip(others);
}
|
3bce16 | 2016-06-02 | Henrik Grubbström (Grubba) | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | this_program then(void|function(mixed, mixed ... : mixed) onfulfilled,
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | void|function(mixed, mixed ... : mixed) onrejected,
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | mixed ... extra) {
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | Promise p = Promise();
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | if (onfulfilled)
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | | on_success(apply_smart, p, onfulfilled, extra);
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | else
on_success(p->success);
if (onrejected)
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | | on_failure(apply_smart, p, onrejected, extra);
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | else
on_failure(p->failure);
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | return p->future();
}
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | inline this_program thencatch(function(mixed, mixed ... : mixed) onrejected,
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | mixed ... extra) {
|
ccbf01 | 2016-12-01 | Stephen R. van den Berg | | return then(0, onrejected, @extra);
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | }
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
3bce16 | 2016-06-02 | Henrik Grubbström (Grubba) | | this_program timeout(int|float seconds)
{
Promise p = Promise();
on_failure(p->failure);
on_success(p->success);
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | | call_out(p->try_failure, seconds, ({ "Timeout.\n", backtrace() }));
|
3bce16 | 2016-06-02 | Henrik Grubbström (Grubba) | | return p->future();
}
|
18b8b2 | 2017-06-08 | Martin Nilsson | |
protected string _sprintf(int t)
{
return t=='O' && sprintf("%O(%s,%O)", this_program,
([ STATE_PENDING : "pending",
STATE_REJECTED : "rejected",
STATE_FULFILLED : "fulfilled" ])[state],
result);
}
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
69eac7 | 2018-05-18 | Martin Nilsson | | protected class AggregateState
|
d0704d | 2017-11-27 | Martin Nilsson | | {
|
584556 | 2017-11-26 | Stephen R. van den Berg | | private Promise promise;
|
d4dd11 | 2017-11-27 | Stephen R. van den Berg | | private int(0..) promises;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | private int(0..) succeeded, failed;
|
d4dd11 | 2017-11-27 | Stephen R. van den Berg | | final array(mixed) results;
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | | final int(0..) min_failures;
final int(-1..) max_failures;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | final mixed accumulator;
final function(mixed, mixed, mixed ... : mixed) fold_fun;
final array(mixed) extra;
|
d0704d | 2017-11-27 | Martin Nilsson | | private void create(Promise p)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | if (p->_materialised || p->_materialised++)
error("Cannot materialise a Promise more than once.\n");
promise = p;
}
|
d0704d | 2017-11-27 | Martin Nilsson | | final void materialise()
{
if (promise->_astate)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | promise->_astate = 0;
|
d0704d | 2017-11-27 | Martin Nilsson | | if (results)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | promises = sizeof(results);
array(Future) futures = results;
if (fold_fun)
results = 0;
|
d0704d | 2017-11-27 | Martin Nilsson | | foreach(futures; int idx; Future f)
|
bab45d | 2017-12-04 | Stephen R. van den Berg | | f->on_failure(cb_failure, idx)->on_success(cb_success, idx);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
}
}
|
d0704d | 2017-11-27 | Martin Nilsson | | private void fold_one(mixed val)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | mixed err = catch (accumulator = fold_fun(val, accumulator, @extra));
|
51fd61 | 2017-11-27 | Martin Nilsson | | if (err && promise)
promise->failure(err);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
|
d0704d | 2017-11-27 | Martin Nilsson | | private void fold(function(mixed:void) failsucc)
{
|
d4dd11 | 2017-11-27 | Stephen R. van den Berg | | failsucc(fold_fun ? accumulator : results);
|
ac24ac | 2017-11-27 | Stephen R. van den Berg | | results = 0;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
|
d0704d | 2017-11-27 | Martin Nilsson | | private void cb_failure(mixed value, int idx)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | Promise p;
|
d0704d | 2017-11-27 | Martin Nilsson | | if (p = promise)
{
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | Thread.MutexKey key = mux->lock();
|
d0704d | 2017-11-27 | Martin Nilsson | | do
{
if (!p->state)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | ++failed;
|
d0704d | 2017-11-27 | Martin Nilsson | | if (max_failures < failed && max_failures >= 0)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | key = 0;
p->try_failure(value);
break;
}
int success = succeeded + failed == promises;
key = 0;
if (results)
results[idx] = value;
else
fold_one(value);
|
d0704d | 2017-11-27 | Martin Nilsson | | if (success)
{
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | | fold(failed >= min_failures ? p->success : p->failure);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | break;
}
|
d0704d | 2017-11-27 | Martin Nilsson | | }
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return;
} while (0);
|
ac24ac | 2017-11-27 | Stephen R. van den Berg | | promise = 0;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
}
|
d0704d | 2017-11-27 | Martin Nilsson | | private void cb_success(mixed value, int idx)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | Promise p;
|
d0704d | 2017-11-27 | Martin Nilsson | | if (p = promise)
{
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | Thread.MutexKey key = mux->lock();
|
d0704d | 2017-11-27 | Martin Nilsson | | do
{
if (!p->state)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | ++succeeded;
|
d0704d | 2017-11-27 | Martin Nilsson | | if (promises - min_failures < succeeded)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | key = 0;
p->try_failure(value);
break;
}
int success = succeeded + failed == promises;
key = 0;
if (results)
results[idx] = value;
else
fold_one(value);
|
d0704d | 2017-11-27 | Martin Nilsson | | if (success)
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | fold(p->success);
break;
}
|
d0704d | 2017-11-27 | Martin Nilsson | | }
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return;
} while (0);
|
ac24ac | 2017-11-27 | Stephen R. van den Berg | | promise = 0;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
}
}
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
|
c60ad2 | 2016-04-13 | Henrik Grubbström (Grubba) | |
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | class Promise
{
inherit Future;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | final int _materialised;
|
d0704d | 2017-11-27 | Martin Nilsson | | final AggregateState _astate;
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | |
|
dbf05a | 2016-12-03 | Stephen R. van den Berg | |
protected void create(void|
function(function(mixed:void),
|
d0704d | 2017-11-27 | Martin Nilsson | | function(mixed:void), mixed ...:void) executor, mixed ... extra)
{
|
dbf05a | 2016-12-03 | Stephen R. van den Berg | | if (executor)
executor(success, failure, @extra);
}
|
d0704d | 2017-11-27 | Martin Nilsson | | Future on_success(function(mixed, mixed ... : void) cb, mixed ... extra)
{
if (_astate)
|
0831fe | 2017-11-28 | Stephen R. van den Berg | | _astate->materialise();
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return ::on_success(cb, @extra);
}
|
d0704d | 2017-11-27 | Martin Nilsson | | Future on_failure(function(mixed, mixed ... : void) cb, mixed ... extra)
{
if (_astate)
|
0831fe | 2017-11-28 | Stephen R. van den Berg | | _astate->materialise();
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return ::on_failure(cb, @extra);
}
|
d0704d | 2017-11-27 | Martin Nilsson | | mixed get()
{
if (_astate)
|
0831fe | 2017-11-28 | Stephen R. van den Berg | | _astate->materialise();
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return ::get();
}
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | |
Future future()
{
return Future::this;
}
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | protected this_program finalise(State newstate, mixed value, int try,
array(array(function(mixed, mixed ...: void)|array(mixed))) cbs,
|
d0704d | 2017-11-27 | Martin Nilsson | | void|function(mixed : void) globalfailure)
{
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | Thread.MutexKey key = mux->lock();
|
d0704d | 2017-11-27 | Martin Nilsson | | if (!state)
{
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | state = newstate;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | result = value;
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | key = 0;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | cond->broadcast();
|
d0704d | 2017-11-27 | Martin Nilsson | | if (sizeof(cbs))
{
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | foreach(cbs; ; array cb)
if (cb)
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | callout(cb[0], 0, value, @cb[1..]);
|
d0704d | 2017-11-27 | Martin Nilsson | | }
else if (globalfailure)
|
76c614 | 2017-11-28 | Stephen R. van den Berg | | callout(globalfailure, 0, value);
|
595ce0 | 2017-12-01 | Stephen R. van den Berg | | failure_cbs = success_cbs = 0;
|
d0704d | 2017-11-27 | Martin Nilsson | | }
else
{
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | key = 0;
if (!try)
error("Promise has already been finalised.\n");
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | return this_program::this;
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | |
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | this_program success(mixed value, void|int try)
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | {
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | return finalise(STATE_FULFILLED, value, try, success_cbs);
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | | }
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | inline this_program try_success(mixed value)
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | | {
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | return state ? this_program::this : success(value, 1);
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | |
|
dd2f1a | 2016-05-31 | Henrik Grubbström (Grubba) | |
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | this_program failure(mixed value, void|int try)
|
dd2f1a | 2016-05-31 | Henrik Grubbström (Grubba) | | {
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | return
finalise(STATE_REJECTED, value, try, failure_cbs, global_on_failure);
|
dd2f1a | 2016-05-31 | Henrik Grubbström (Grubba) | | }
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
82356b | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
bf700d | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | inline this_program try_failure(mixed value)
|
126bb3 | 2016-06-01 | Henrik Grubbström (Grubba) | | {
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | return state ? this_program::this : failure(value, 1);
|
126bb3 | 2016-06-01 | Henrik Grubbström (Grubba) | | }
|
d0704d | 2017-11-27 | Martin Nilsson | | inline private void fill_astate()
{
|
584556 | 2017-11-26 | Stephen R. van den Berg | | if (!_astate)
|
d0704d | 2017-11-27 | Martin Nilsson | | _astate = AggregateState(this);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | }
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | |
|
937900 | 2017-11-27 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | | this_program depend(array(Future) futures)
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | {
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | | if (sizeof(futures)) {
|
584556 | 2017-11-26 | Stephen R. van den Berg | | fill_astate();
_astate->results += futures;
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | }
|
079bac | 2017-11-25 | Stephen R. van den Berg | | return this_program::this;
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | }
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | | inline variant this_program depend(Future ... futures)
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | {
return depend(futures);
}
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | | variant this_program depend()
{
Promise p = Promise();
depend(p->future());
return p;
}
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
d15f0c | 2017-11-24 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
0d613e | 2017-11-23 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
this_program fold(mixed initial,
function(mixed, mixed, mixed ... : mixed) fun,
mixed ... extra)
{
if (_astate) {
_astate->accumulator = initial;
_astate->fold_fun = fun;
_astate->extra = extra;
_astate->materialise();
} else
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | success(initial);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return this_program::this;
}
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
this_program first_completed()
{
if (_astate) {
|
bab45d | 2017-12-04 | Stephen R. van den Berg | | _astate->results->on_failure(try_failure)->on_success(try_success);
|
584556 | 2017-11-26 | Stephen R. van den Berg | | _astate = 0;
} else
success(0);
return this_program::this;
}
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
d4eb91 | 2017-11-28 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
this_program max_failures(int(-1..) max)
|
584556 | 2017-11-26 | Stephen R. van den Berg | | {
fill_astate();
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | | _astate->max_failures = max;
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return this_program::this;
}
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
this_program min_failures(int(0..) min)
|
584556 | 2017-11-26 | Stephen R. van den Berg | | {
fill_astate();
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | | _astate->min_failures = min;
|
079bac | 2017-11-25 | Stephen R. van den Berg | | return this_program::this;
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | }
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | | this_program any_results()
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | {
|
2ea94f | 2017-11-27 | Stephen R. van den Berg | | return max_failures(-1);
|
4d37ce | 2017-11-22 | Stephen R. van den Berg | | }
|
c071bc | 2017-11-05 | Henrik Grubbström (Grubba) | | protected void _destruct()
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | {
|
4ad02b | 2017-11-27 | Stephen R. van den Berg | | if (!state)
try_failure(({ "Promise broken.\n", backtrace() }));
|
9654f7 | 2016-04-12 | Henrik Grubbström (Grubba) | | }
}
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | variant Future first_completed(array(Future) futures)
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | {
|
584556 | 2017-11-26 | Stephen R. van den Berg | | return Promise()->depend(futures)->first_completed()->future();
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | }
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | variant inline Future first_completed(Future ... futures)
{
return first_completed(futures);
}
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | variant inline Future race(array(Future) futures)
{
return first_completed(futures);
}
variant inline Future race(Future ... futures)
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | {
return first_completed(futures);
}
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | variant Future results(array(Future) futures)
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | {
|
2f2c4e | 2018-04-09 | Martin Karlgren | | if(!sizeof(futures))
return resolve(({}));
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | return Promise()->depend(futures)->future();
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | }
|
1d407b | 2016-11-18 | Stephen R. van den Berg | | inline variant Future results(Future ... futures)
{
return results(futures);
}
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
584556 | 2017-11-26 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | | inline variant Future all(array(Future) futures)
{
return results(futures);
}
inline variant Future all(Future ... futures)
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | {
return results(futures);
}
Future reject(mixed reason)
{
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | return Promise()->failure(reason)->future();
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | }
|
6e2729 | 2016-11-18 | Stephen R. van den Berg | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
Future resolve(mixed value)
{
|
ae447a | 2017-11-27 | Martin Nilsson | | if (objectp(value) && value->on_failure && value->on_success)
return value;
return Promise()->success(value)->future();
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | | }
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | |
|
6b0188 | 2016-11-09 | Stephen R. van den Berg | |
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | Future traverse(array(Future) futures,
function(mixed, mixed ... : mixed) fun,
mixed ... extra)
{
return results(futures->map(fun, @extra));
}
|
8e1455 | 2016-10-26 | Henrik Grubbström (Grubba) | |
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | Future fold(array(Future) futures,
mixed initial,
function(mixed, mixed, mixed ... : mixed) fun,
mixed ... extra)
{
|
e32dd0 | 2017-11-27 | Stephen R. van den Berg | | return Promise()->depend(futures)->fold(initial, fun, extra)->future();
|
aa5126 | 2016-04-18 | Henrik Grubbström (Grubba) | | }
|