Creator::promises()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 3
c 1
b 0
f 1
nc 1
nop 2
dl 0
loc 5
rs 10
1
<?php
2
/**
3
 * Job creator
4
 * User: moyo
5
 * Date: 2018/7/17
6
 * Time: 10:47 AM
7
 */
8
9
namespace Carno\Coroutine\Job;
10
11
use Carno\Coroutine\Context;
12
use Carno\Coroutine\Job;
13
use Carno\Promise\Promise;
14
use Carno\Promise\Promised;
15
use Generator;
16
use Throwable;
17
18
class Creator
19
{
20
    /**
21
     * @param mixed[] $programs
22
     * @return array [programs, context]
23
     */
24
    public static function context(array $programs) : array
25
    {
26
        $ctx = null;
27
28
        foreach ($programs as $id => $program) {
29
            if ($program instanceof Context) {
30
                $ctx = $program;
31
                unset($programs[$id]);
32
                break;
33
            }
34
        }
35
36
        return [$programs, $ctx];
37
    }
38
39
    /**
40
     * @param mixed[] $programs
41
     * @param Context $ctx
42
     * @return Promised[]
43
     */
44
    public static function promises(array $programs, Context $ctx = null) : array
45
    {
46
        return array_map(static function ($program) use ($ctx) {
47
            return self::promised($program, [], $ctx);
48
        }, $programs);
49
    }
50
51
    /**
52
     * @param mixed $program
53
     * @param array $args
54
     * @param Context $ctx
55
     * @return Promised
56
     */
57
    public static function promised($program, array $args = [], Context $ctx = null) : Promised
58
    {
59
        if ($program instanceof Promised) {
60
            return $program;
61
        } elseif ($program instanceof Generator) {
62
            return (new Job($program, $ctx))->end();
63
        } elseif (is_callable($program)) {
64
            try {
65
                return self::promised(call_user_func($program, ...$args), [], $ctx);
66
            } catch (Throwable $e) {
67
                return Promise::rejected($e);
68
            }
69
        } else {
70
            return Promise::resolved($program);
71
        }
72
    }
73
}
74