Passed
Push — master ( 9d4bf9...615338 )
by Radosław
02:10
created

Phln::__callStatic()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Baethon\Phln;
6
7
final class Phln
8
{
9
    public const __ = '_phln_fn_partial_placeholder';
10
11
    /**
12
     * @var callable[] $macros
13
     */
14
    protected static array $macros = [];
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_ARRAY, expecting T_FUNCTION or T_CONST
Loading history...
15
16
    private function __construct()
17
    {
18
    }
19
20
    /**
21
     * Makes an alias for given macro
22
     *
23
     * @param string $macroName
24
     * @param string $targetMacro
25
     * @return void
26
     */
27
    public static function alias(string $macroName, string $targetMacro): void
28
    {
29
        static::macro($macroName, static::raw($targetMacro));
30
    }
31
32
    /**
33
     * Returns "reference" to one of Phln macros or methods
34
     *
35
     * @param string $macroName
36
     * @return callable
37
     */
38
    public static function raw(string $macroName): callable
39
    {
40
        if (static::hasMacro($macroName)) {
41
            return static::$macros[$macroName];
42
        }
43
44
        /** @var callable $callable */
45
        $callable = sprintf('%s::%s', static::class, $macroName);
46
47
        return $callable;
48
    }
49
50
    public static function arity(callable $fn): int
51
    {
52
        return ($fn instanceof FixedArityInterface)
53
            ? $fn->getArity()
54
            : (new \ReflectionFunction($fn))->getNumberOfParameters();
55
    }
56
57
    /**
58
     * @param callable $fn
59
     * @param array<int, mixed> $args
60
     * @return CurriedFn|mixed
61
     */
62
    public static function curry(callable $fn, array $args = [])
63
    {
64
        return CurriedFn::of($fn)(...$args);
65
    }
66
67
    /**
68
     * @param int $n
69
     * @param callable $fn
70
     * @param array<int, mixed> $args
71
     * @return CurriedFn|mixed
72
     */
73
    public static function curryN(int $n, callable $fn, array $args = [])
74
    {
75
        return CurriedFn::ofN($n, $fn)(...$args);
76
    }
77
78
    public static function macro(string $name, callable $macro): void
79
    {
80
        static::$macros[$name] = $macro;
81
    }
82
83
    public static function hasMacro(string $name): bool
84
    {
85
        return isset(static::$macros[$name]);
86
    }
87
88
    /**
89
     * @param string $method
90
     * @param mixed[] $parameters
91
     * @return mixed
92
     */
93
    public static function __callStatic($method, $parameters)
94
    {
95
        if (! static::hasMacro($method)) {
96
            throw new \BadMethodCallException("Method {$method} does not exist.");
97
        }
98
99
        return static::curry(static::$macros[$method], $parameters);
100
    }
101
}
102