Skip to content

Commit e8c92ef

Browse files
committed
More work on deferreds and promises
1 parent 5f5c202 commit e8c92ef

File tree

3 files changed

+73
-21
lines changed

3 files changed

+73
-21
lines changed

lib/MonadPHP/Deferred.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace MonadPHP;
4+
5+
class Deferred extends Promise {
6+
7+
protected $isResolved = false;
8+
protected $succeed = null;
9+
10+
protected $children = array();
11+
protected $success;
12+
protected $failure;
13+
14+
public function __construct() {
15+
}
16+
17+
public function succeed($value) {
18+
$this->resolve(true, $value);
19+
}
20+
21+
public function fail($value) {
22+
$this->resolve(false, $value);
23+
}
24+
25+
}

lib/MonadPHP/Promise.php

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,19 @@ public function __construct($success = null, $failure = null) {
1717
}
1818

1919
public function unit($success = null, $failure = null) {
20-
return new static($success, $failure);
20+
return new Promise($success, $failure);
2121
}
2222

2323
public function bind($success, $failure) {
2424
$obj = $this->unit($success, $failure);
2525
if ($this->isResolved) {
26-
if ($this->succeed) {
27-
$obj->succeed($this->value);
28-
} else {
29-
$obj->fail($this->value);
30-
}
26+
$obj->resolve($this->succeed, $this->value);
3127
} else {
3228
$this->children[] = $obj;
3329
}
3430
return $obj;
3531
}
3632

37-
public function succeed($value) {
38-
$this->resolve(true, $value);
39-
}
40-
41-
public function fail($value) {
42-
$this->resolve(false, $value);
43-
}
44-
4533
protected function resolve($status, $value) {
4634
if ($this->isResolved) {
4735
throw new \BadMethodCallException('Promise already resolved');
@@ -53,9 +41,8 @@ protected function resolve($status, $value) {
5341
if ($callback) {
5442
call_user_func($callback, $value);
5543
}
56-
$method = $status ? 'succeed' : 'fail';
5744
foreach ($this->children as $child) {
58-
$child->$method($value);
45+
$child->resolve($status, $value);
5946
}
6047
}
6148

test/MonadPHP/PromiseTest.php

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
class PromiseTest extends \PHPUnit_Framework_TestCase {
66

7-
public function testBind() {
8-
$promise = new Promise;
7+
public function testFail() {
8+
$promise = new Deferred;
99
$calledSuccess = false;
1010
$calledFailure = false;
1111
$promise->when(function() use (&$calledSuccess) {
@@ -16,16 +16,56 @@ public function testBind() {
1616
$this->assertFalse($calledSuccess);
1717
$this->assertFalse($calledFailure);
1818

19-
$promise->succeed(true);
20-
$this->assertTrue($calledSuccess);
19+
$promise->fail(true);
20+
$this->assertFalse($calledSuccess, 'Not successful');
21+
$this->assertTrue($calledFailure, 'Failed!');
22+
23+
try {
24+
$promise->succeed(true);
25+
$this->fail('No exception raised');
26+
} catch (\BadMethodCallException $e) {
27+
$this->assertFalse($calledSuccess);
28+
}
29+
}
30+
31+
32+
public function testSucceed() {
33+
$promise = new Deferred;
34+
$calledSuccess = false;
35+
$calledFailure = false;
36+
$promise->when(function() use (&$calledSuccess) {
37+
$calledSuccess = true;
38+
}, function() use (&$calledFailure) {
39+
$calledFailure = true;
40+
});
41+
$this->assertFalse($calledSuccess);
2142
$this->assertFalse($calledFailure);
2243

44+
$promise->succeed(true);
45+
$this->assertTrue($calledSuccess, 'Success was not called');
46+
$this->assertFalse($calledFailure, 'Fail was called');
47+
2348
try {
2449
$promise->fail(true);
2550
$this->fail('No exception raised');
2651
} catch (\BadMethodCallException $e) {
27-
$this->assertFalse($calledFailure);
52+
$this->assertFalse($calledFailure, 'Fail is true!');
2853
}
2954
}
3055

56+
public function testAlreadyResolvedPromise() {
57+
$promise = new Deferred();
58+
$promise->succeed(true);
59+
$calledSuccess = false;
60+
$calledFailure = false;
61+
$promise->when(function() use (&$calledSuccess) {
62+
$calledSuccess = true;
63+
}, function() use (&$calledFailure) {
64+
$calledFailure = true;
65+
});
66+
$this->assertTrue($calledSuccess);
67+
$this->assertFalse($calledFailure);
68+
69+
}
70+
3171
}

0 commit comments

Comments
 (0)