Passed
Push — master ( c690b9...7dfb70 )
by Sérgio
02:24
created

Pipeline::__call()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 21
ccs 14
cts 14
cp 1
rs 9.3142
cc 3
eloc 12
nc 1
nop 2
crap 3
1
<?php
2
3
namespace Sergiors\Pipeline;
4
5
/**
6
 * @author Sérgio Rafael Siqueira <[email protected]>
7
 */
8
final class Pipeline
9
{
10
    /**
11
     * @var callable[]
12
     */
13
    private $callbacks;
14
15
    /**
16
     * @param array $callbacks
17
     */
18 7
    public function __construct(array $callbacks = [])
19
    {
20 7
        $this->callbacks = array_filter($callbacks, 'is_callable');
21 7
    }
22
23
    /**
24
     * @param callable $callback
25
     *
26
     * @return Pipeline
27
     */
28 7
    public function pipe(callable $callback)
29
    {
30 7
        return new self(array_merge($this->callbacks, [$callback]));
31
    }
32
33
    /**
34
     * @param mixed $payload
35
     *
36
     * @return mixed
37
     */
38 7
    public function process($payload /* ...$args */)
39
    {
40 7
        $rest = array_slice(func_get_args(), 1);
41
42
        return array_reduce($this->callbacks, function ($payload, $callback) use ($rest) {
43 7
            return call_user_func_array($callback, array_merge([$payload], $rest));
44 7
        }, $payload);
45
    }
46
47
    /**
48
     * @param callable $fn
49
     * @param array    $args
50
     *
51
     * @return Pipeline
52
     */
53 1
    public function __call(callable $fn, array $args)
54
    {
55 1
        $ks = (new self())
56
            ->pipe(new Filter(function ($x) {
57 1
                return '%' === $x;
58 1
            }))
59
            ->pipe(function ($xs) {
60 1
                return array_keys($xs) ?: [];
61 1
            })
62 1
            ->process($args);
63
64 1
        return $this->pipe(function ($payload) use ($fn, $args, $ks) {
65 1
            if ([] === $ks) {
66 1
                return call_user_func_array($fn, array_merge($args, [$payload]));
67
            }
68
69 1
            return call_user_func_array($fn, array_replace($args, [
70 1
                $ks[0] => $payload
71 1
            ]));
72 1
        });
73
    }
74
75
    /**
76
     * @return mixed
77
     */
78 7
    public function __invoke(/* ...$args */)
79
    {
80 7
        return call_user_func_array([$this, 'process'], func_get_args());
81
    }
82
}
83