1<?php
2
3namespace React\Promise;
4
5class FulfilledPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
6{
7    private $value;
8
9    public function __construct($value = null)
10    {
11        if ($value instanceof PromiseInterface) {
12            throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.');
13        }
14
15        $this->value = $value;
16    }
17
18    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
19    {
20        if (null === $onFulfilled) {
21            return $this;
22        }
23
24        try {
25            return resolve($onFulfilled($this->value));
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 === $onFulfilled) {
36            return;
37        }
38
39        $result = $onFulfilled($this->value);
40
41        if ($result instanceof ExtendedPromiseInterface) {
42            $result->done();
43        }
44    }
45
46    public function otherwise(callable $onRejected)
47    {
48        return $this;
49    }
50
51    public function always(callable $onFulfilledOrRejected)
52    {
53        return $this->then(function ($value) use ($onFulfilledOrRejected) {
54            return resolve($onFulfilledOrRejected())->then(function () use ($value) {
55                return $value;
56            });
57        });
58    }
59
60    public function progress(callable $onProgress)
61    {
62        return $this;
63    }
64
65    public function cancel()
66    {
67    }
68}
69