1<?php
2
3namespace GuzzleHttp\Promise;
4
5final class Create
6{
7    /**
8     * Creates a promise for a value if the value is not a promise.
9     *
10     * @param mixed $value Promise or value.
11     *
12     * @return PromiseInterface
13     */
14    public static function promiseFor($value)
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            return $promise;
27        }
28
29        return new FulfilledPromise($value);
30    }
31
32    /**
33     * Creates a rejected promise for a reason if the reason is not a promise.
34     * If the provided reason is a promise, then it is returned as-is.
35     *
36     * @param mixed $reason Promise or reason.
37     *
38     * @return PromiseInterface
39     */
40    public static function rejectionFor($reason)
41    {
42        if ($reason instanceof PromiseInterface) {
43            return $reason;
44        }
45
46        return new RejectedPromise($reason);
47    }
48
49    /**
50     * Create an exception for a rejected promise value.
51     *
52     * @param mixed $reason
53     *
54     * @return \Exception|\Throwable
55     */
56    public static function exceptionFor($reason)
57    {
58        if ($reason instanceof \Exception || $reason instanceof \Throwable) {
59            return $reason;
60        }
61
62        return new RejectionException($reason);
63    }
64
65    /**
66     * Returns an iterator for the given value.
67     *
68     * @param mixed $value
69     *
70     * @return \Iterator
71     */
72    public static function iterFor($value)
73    {
74        if ($value instanceof \Iterator) {
75            return $value;
76        }
77
78        if (is_array($value)) {
79            return new \ArrayIterator($value);
80        }
81
82        return new \ArrayIterator([$value]);
83    }
84}
85