1<?php
2
3namespace React\Promise;
4
5class RejectedPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
6{
7    private $reason;
8
9    public function __construct($reason = null)
10    {
11        if ($reason instanceof PromiseInterface) {
12            throw new \InvalidArgumentException('You cannot create React\Promise\RejectedPromise with a promise. Use React\Promise\reject($promiseOrValue) instead.');
13        }
14
15        $this->reason = $reason;
16    }
17
18    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
19    {
20        if (null === $onRejected) {
21            return $this;
22        }
23
24        try {
25            return resolve($onRejected($this->reason));
26        } catch (\Throwable $exception) {
27            return new RejectedPromise($exception);
28        } catch (\Exception $exception) {
29            return new RejectedPromise($exception);
30        }
31    }
32
33    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
34    {
35        if (null === $onRejected) {
36            throw UnhandledRejectionException::resolve($this->reason);
37        }
38
39        $result = $onRejected($this->reason);
40
41        if ($result instanceof self) {
42            throw UnhandledRejectionException::resolve($result->reason);
43        }
44
45        if ($result instanceof ExtendedPromiseInterface) {
46            $result->done();
47        }
48    }
49
50    public function otherwise(callable $onRejected)
51    {
52        if (!_checkTypehint($onRejected, $this->reason)) {
53            return $this;
54        }
55
56        return $this->then(null, $onRejected);
57    }
58
59    public function always(callable $onFulfilledOrRejected)
60    {
61        return $this->then(null, function ($reason) use ($onFulfilledOrRejected) {
62            return resolve($onFulfilledOrRejected())->then(function () use ($reason) {
63                return new RejectedPromise($reason);
64            });
65        });
66    }
67
68    public function progress(callable $onProgress)
69    {
70        return $this;
71    }
72
73    public function cancel()
74    {
75    }
76}
77