1<?php
2
3namespace React\Promise;
4
5/**
6 * @deprecated 2.8.0 LazyPromise is deprecated and should not be used anymore.
7 */
8class LazyPromise implements ExtendedPromiseInterface, CancellablePromiseInterface
9{
10    private $factory;
11    private $promise;
12
13    public function __construct(callable $factory)
14    {
15        $this->factory = $factory;
16    }
17
18    public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
19    {
20        return $this->promise()->then($onFulfilled, $onRejected, $onProgress);
21    }
22
23    public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null)
24    {
25        return $this->promise()->done($onFulfilled, $onRejected, $onProgress);
26    }
27
28    public function otherwise(callable $onRejected)
29    {
30        return $this->promise()->otherwise($onRejected);
31    }
32
33    public function always(callable $onFulfilledOrRejected)
34    {
35        return $this->promise()->always($onFulfilledOrRejected);
36    }
37
38    public function progress(callable $onProgress)
39    {
40        return $this->promise()->progress($onProgress);
41    }
42
43    public function cancel()
44    {
45        return $this->promise()->cancel();
46    }
47
48    /**
49     * @internal
50     * @see Promise::settle()
51     */
52    public function promise()
53    {
54        if (null === $this->promise) {
55            try {
56                $this->promise = resolve(\call_user_func($this->factory));
57            } catch (\Throwable $exception) {
58                $this->promise = new RejectedPromise($exception);
59            } catch (\Exception $exception) {
60                $this->promise = new RejectedPromise($exception);
61            }
62        }
63
64        return $this->promise;
65    }
66}
67