public function __construct(Observable $observable)
{
$this->observable = $observable;
$deferred =& $this->deferred;
$values =& $this->values;
$deferreds =& $this->deferreds;
$resolved =& $this->resolved;
$this->observable->subscribe(static function ($value) use(&$deferred, &$values, &$deferreds, &$resolved) {
$values[] = $value;
$deferreds[] = $pressure = new Deferred();
if ($deferred !== null) {
$temp = $deferred;
$deferred = null;
$temp->resolve(true);
}
if ($resolved) {
return null;
}
return $pressure->promise();
});
$result =& $this->result;
$error =& $this->exception;
$this->observable->when(static function ($exception, $value) use(&$deferred, &$result, &$error, &$resolved) {
$resolved = true;
if ($exception) {
$result = null;
$error = $exception;
if ($deferred !== null) {
$deferred->fail($exception);
}
return;
}
$result = $value;
if ($deferred !== null) {
$deferred->resolve(false);
}
});
}