Completed
Push — master ( 0ac2b6...073708 )
by Josh
02:05
created

CoalesceSingleCharacterPrefix::runPass()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 10
nc 3
nop 1
crap 3
1
<?php
2
3
/**
4
* @package   s9e\RegexpBuilder
5
* @copyright Copyright (c) 2016 The s9e Authors
6
* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
7
*/
8
namespace s9e\RegexpBuilder\Passes;
9
10
/**
11
* Replaces (?:ab|bb|c) with (?:[ab]b|c)
12
*/
13
class CoalesceSingleCharacterPrefix extends AbstractPass
14
{
15
	/**
16
	* {@inheritdoc}
17
	*/
18 5
	protected function runPass(array $strings)
19
	{
20 5
		$newStrings = [];
21 5
		foreach ($this->getEligibleKeys($strings) as $keys)
22
		{
23
			// Create a new string to hold the merged strings and replace the first element with
24
			// an empty character class
25 2
			$newString    = $strings[$keys[0]];
26 2
			$newString[0] = [];
27 2
			foreach ($keys as $key)
28
			{
29 2
				$newString[0][] = [$strings[$key][0]];
30 2
				unset($strings[$key]);
31
			}
32 2
			$newStrings[] = $newString;
33
		}
34
35 5
		return array_merge($newStrings, $strings);
36
	}
37
38
	/**
39
	* Filter the list of eligible keys and keep those that have at least two matches
40
	*
41
	* @param  array[] $eligibleKeys List of lists of keys
42
	* @return array[]
43
	*/
44 5
	protected function filterEligibleKeys(array $eligibleKeys)
45
	{
46 5
		$filteredKeys = [];
47 5
		foreach ($eligibleKeys as $k => $keys)
48
		{
49 4
			if (count($keys) > 1)
50
			{
51 4
				$filteredKeys[] = $keys;
52
			}
53
		}
54
55 5
		return $filteredKeys;
56
	}
57
58
	/**
59
	* Get a list of keys of strings eligible to be merged together, grouped by suffix
60
	*
61
	* @param  array[] $strings
62
	* @return array[]
63
	*/
64 5
	protected function getEligibleKeys(array $strings)
65
	{
66 5
		$eligibleKeys = [];
67 5
		foreach ($strings as $k => $string)
68
		{
69 5
			if (!is_array($string[0]) && isset($string[1]))
70
			{
71 4
				$suffix = serialize(array_slice($string, 1));
72 5
				$eligibleKeys[$suffix][] = $k;
73
			}
74
		}
75
76 5
		return $this->filterEligibleKeys($eligibleKeys);
77
	}
78
}