GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 08b73a...14e86b )
by Gilles
02:19
created

Matcher   B

Complexity

Total Complexity 36

Size/Duplication

Total Lines 151
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 0

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 151
ccs 52
cts 52
cp 1
rs 8.8
c 0
b 0
f 0
wmc 36
lcom 2
cbo 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A _parseBooleanConstant() 0 5 4
A _parseStringConstant() 0 5 3
A _parseIdentifier() 0 4 2
A _parseWildcard() 0 4 1
C _parseArray() 0 31 7
B _parseCons() 0 28 6
A _parseAs() 0 7 2
B parse() 0 20 7
A match() 0 14 4
1
<?php
2
3
namespace PHPFunctional\PatternMatching;
4
5
class Matcher
6
{
7
    private static $reserved = ['true', 'false'];
8
9
    private static $rules = [
10
        '/^(true|false)$/i' => '_parseBooleanConstant',
11
        '/^([\'"])(?:(?!\\1).)*\\1$/' => '_parseStringConstant',
12
        '/^[a-zA-Z]+$/' => '_parseIdentifier',
13
        '/^_$/' => '_parseWildcard',
14
        '/^\\[.*\\]$/' => '_parseArray',
15
        '/^\\([^:]+:.+\\)$/' => '_parseCons',
16
        '/^[a-zA-Z]+@.+$/' => '_parseAs',
17
    ];
18
19 4
    private static function _parseBooleanConstant($value, $pattern)
20
    {
21
        $pattern_value = strtoupper($pattern) === 'TRUE' ? true : false;
22
        return is_bool($value) && $value === $pattern_value ? [] : false;
23
    }
24 4
25 4
    private static function _parseStringConstant($value, $pattern)
26
    {
27
        $string_pattern = substr($pattern, 1, -1);
28
        return is_string($value) && $string_pattern == $value ? [] : false;
29
    }
30 4
31
    private static function _parseIdentifier($value, $pattern)
32
    {
33
        return in_array(strtolower($pattern), self::$reserved) ? false : [$value];
34
    }
35 4
36
    private static function _parseWildcard($value, $pattern)
37
    {
38
        return [];
39
    }
40 4
41 4
    private static function _parseArray($value, $pattern)
42
    {
43
        if(! is_array($value)) {
44 4
            return false;
45
        }
46 4
47 4
        $patterns = array_filter(array_map('trim', split_enclosed(',', '[', ']', substr($pattern, 1, -1))));
48
49
        if(count($patterns) === 0) {
50 4
            return count($value) === 0 ? [] : false;
51 4
        }
52
53
        if(count($patterns) > count($value)) {
54 4
            return false;
55 4
        }
56 4
57 4
        $index = 0;
58
        $results = [];
59 4
        foreach($value as $v) {
60 4
            $new = self::parse($v, $patterns[$index]);
61
62
            if($new === false) {
63 4
                return false;
64 4
            }
65
66
            $results = array_merge($results, $new);
67 4
            ++$index;
68
        }
69
70
        return $results;
71
    }
72 4
73 4
    private static function _parseCons($value, $pattern)
74
    {
75
        if(! is_array($value)) {
76 4
            return false;
77 4
        }
78
79 4
        $patterns = array_filter(array_map('trim', split_enclosed(':', '(', ')', substr($pattern, 1, -1))));
80 4
        $last = array_pop($patterns);
81 4
82 4
        $results = [];
83
        foreach($patterns as $p) {
84
            if(count($value) == 0) {
85 4
                return false;
86
            }
87 4
88 4
            $new = self::parse(array_shift($value), $p);
89
90
            if($new === false) {
91 4
                return false;
92
            }
93
94 4
            $results = array_merge($results, $new);
95
        }
96 4
97
        $new = self::parse($value, $last);
98
99
        return $new === false ? false : array_merge($results, $new);
100
    }
101 4
102
    private static function _parseAs($value, $pattern)
103 4
    {
104 4
        $patterns = explode('@', $pattern, 2);
105
106
        $rest = self::parse($value, $patterns[1]);
107
        return $rest === false ? false : array_merge([$value], $rest);
108
    }
109
110
    /**
111
     * @param mixed $value
112
     * @param string $pattern
113
     * @return bool|array
114 4
     */
115
    private static function parse($value, $pattern)
116 4
    {
117 4
        $pattern = trim($pattern);
118
119
        if(is_numeric($pattern) && is_numeric($value)) {
120 4
            return $pattern == $value ? [] : false;
121 4
        }
122 4
123
        foreach(self::$rules as $regex => $method) {
124 4
            if(preg_match($regex, $pattern)) {
125 4
                $arguments = call_user_func_array(['static', $method], [$value, $pattern]);
126
127
                if($arguments !== false) {
128
                    return $arguments;
129
                }
130 4
            }
131
        }
132
133
        return false;
134
    }
135
136
    /**
137
     * @param mixed $value
138
     * @param array $patterns
139
     * @return mixed
140 4
     */
141 4
    public static function match($value, array $patterns)
142
    {
143 4
        foreach($patterns as $pattern => $callback) {
144 4
            $match = self::parse($value, $pattern);
145
146
            if($match !== false) {
147
                return is_callable($callback) ?
148 4
                    call_user_func_array($callback, $match) :
149
                    $callback;
150
            }
151
        }
152
153
        throw new \RuntimeException('Non-exhaustive patterns.');
154
    }
155
}