1<?php
2
3declare(strict_types=1);
4
5namespace GuzzleHttp\Promise;
6
7final class Create
8{
9    /**
10     * Creates a promise for a value if the value is not a promise.
11     *
12     * @param mixed $value Promise or value.
13     */
14    public static function promiseFor($value): PromiseInterface
15    {
16        if ($value instanceof PromiseInterface) {
17            return $value;
18        }
19
20        // Return a Guzzle promise that shadows the given promise.
21        if (is_object($value) && method_exists($value, 'then')) {
22            $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null;
23            $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null;
24            $promise = new Promise($wfn, $cfn);
25            $value->then([$promise, 'resolve'], [$promise, 'reject']);
26
27            return $promise;
28        }
29
30        return new FulfilledPromise($value);
31    }
32
33    /**
34     * Creates a rejected promise for a reason if the reason is not a promise.
35     * If the provided reason is a promise, then it is returned as-is.
36     *
37     * @param mixed $reason Promise or reason.
38     */
39    public static function rejectionFor($reason): PromiseInterface
40    {
41        if ($reason instanceof PromiseInterface) {
42            return $reason;
43        }
44
45        return new RejectedPromise($reason);
46    }
47
48    /**
49     * Create an exception for a rejected promise value.
50     *
51     * @param mixed $reason
52     */
53    public static function exceptionFor($reason): \Throwable
54    {
55        if ($reason instanceof \Throwable) {
56            return $reason;
57        }
58
59        return new RejectionException($reason);
60    }
61
62    /**
63     * Returns an iterator for the given value.
64     *
65     * @param mixed $value
66     */
67    public static function iterFor($value): \Iterator
68    {
69        if ($value instanceof \Iterator) {
70            return $value;
71        }
72
73        if (is_array($value)) {
74            return new \ArrayIterator($value);
75        }
76
77        return new \ArrayIterator([$value]);
78    }
79}
80