Skip to content

Commit

Permalink
Properly handle zero-length array in Promise.inParallel()
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinresol committed Jun 19, 2017
1 parent 3eb290c commit 9322794
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 36 deletions.
74 changes: 38 additions & 36 deletions src/tink/core/Promise.hx
Expand Up @@ -85,42 +85,44 @@ abstract Promise<T>(Surprise<T, Error>) from Surprise<T, Error> to Surprise<T, E
return Future.async(function(cb) p.get().handle(cb), true);

static public function inParallel<T>(a:Array<Promise<T>>, ?lazy:Bool):Promise<Array<T>>
return Future.async(function (cb) {
var result = [],
pending = a.length,
links:CallbackLink = null,
sync = false;

function done(o) {
if (links == null) sync = true;
else links.dissolve();
cb(o);
}

function fail(e:Error) {
done(Failure(e));
}
function set(index, value) {
result[index] = value;
if (--pending == 0)
done(Success(result));
}

var linkArray = [];

for (i in 0...a.length) {
if (sync) break;
linkArray.push(a[i].handle(function (o) switch o {
case Success(v): set(i, v);
case Failure(e): fail(e);
}));
};

links = linkArray;

if (sync)
links.dissolve();
}, lazy);
return
if(a.length == 0) Future.sync(Success([]))
else Future.async(function (cb) {
var result = [],
pending = a.length,
links:CallbackLink = null,
sync = false;

function done(o) {
if (links == null) sync = true;
else links.dissolve();
cb(o);
}

function fail(e:Error) {
done(Failure(e));
}
function set(index, value) {
result[index] = value;
if (--pending == 0)
done(Success(result));
}

var linkArray = [];

for (i in 0...a.length) {
if (sync) break;
linkArray.push(a[i].handle(function (o) switch o {
case Success(v): set(i, v);
case Failure(e): fail(e);
}));
};

links = linkArray;

if (sync)
links.dissolve();
}, lazy);

static public function inSequence<T>(a:Array<Promise<T>>):Promise<Array<T>> {

Expand Down
10 changes: 10 additions & 0 deletions tests/Promises.hx
Expand Up @@ -40,7 +40,17 @@ class Promises extends Base {
assertFalse(done);
t.trigger(Failure(new Error('test')));
assertTrue(done);


counter = 0;
var p = Promise.inParallel([], true);
assertEquals(0, counter);
p.handle(function (o) {
assertTrue(o.isSuccess());
});
assertEquals(0, counter);
}

function testInSequence() {
var counter = 0;
function make(fail:Bool)
Expand Down

0 comments on commit 9322794

Please sign in to comment.