Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
98.97% covered (success)
98.97%
96 / 97
87.50% covered (warning)
87.50%
7 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
MatchOrMatch
98.97% covered (success)
98.97%
96 / 97
87.50% covered (warning)
87.50%
7 / 8
12
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __toString
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
1
 getRegexStringLength
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getMinimalPossibleLength
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
1 / 1
1
 getMaximumPossibleLength
92.31% covered (success)
92.31%
12 / 13
0.00% covered (danger)
0.00%
0 / 1
5.01
 toCaseInsensitive
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
1
 toDotAll
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
1
 removeStartAndEndMarkers
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\RegexTools\Parts;
3
4final class MatchOrMatch implements RegexPartInterface
5{
6    /**
7     * @param array<int, RegexPartInterface> $part1
8     * @param array<int, RegexPartInterface> $part2
9     */
10    public function __construct(
11        public readonly array $part1,
12        public readonly array $part2
13    ) {
14    }
15
16    public function __toString(): string
17    {
18        $callback = function (RegexPartInterface $part) {
19            return $part->__toString();
20        };
21
22        return implode(
23            '',
24                array_map(
25                $callback,
26                $this->part1
27            )
28        ) . '|'
29        . implode(
30            '',
31            array_map(
32                $callback,
33                $this->part2
34            )
35        );
36    }
37
38    public function getRegexStringLength(): int
39    {
40        return array_reduce([...$this->part1, ...$this->part2], function (int $prevValue, RegexPartInterface $part) {
41            return $prevValue + $part->getRegexStringLength();
42        }, 1);
43    }
44
45    public function getMinimalPossibleLength(): int
46    {
47        $part1 = array_sum(
48            array_map(
49                function (RegexPartInterface $part) {
50                    return $part->getMinimalPossibleLength();
51                },
52                $this->part1
53            )
54        );
55        $part2 = array_sum(
56            array_map(
57                function (RegexPartInterface $part) {
58                    return $part->getMinimalPossibleLength();
59                },
60                $this->part2
61            )
62        );
63        return min($part1, $part2);
64    }
65
66    public function getMaximumPossibleLength(): ?int
67    {
68        $sum1 = 0;
69        foreach ($this->part1 as $part) {
70            $max = $part->getMaximumPossibleLength();
71            if ($max === null) {
72                return null;
73            }
74            $sum1 += $max;
75        }
76        $sum2 = 0;
77        foreach ($this->part2 as $part) {
78            $max = $part->getMaximumPossibleLength();
79            if ($max === null) {
80                return null;
81            }
82            $sum2 += $max;
83        }
84        return max($sum1, $sum2);
85    }
86
87    public function toCaseInsensitive(): RegexPartInterface
88    {
89        return new MatchOrMatch(
90            array_map(
91                function (RegexPartInterface $part) {
92                    return $part->toCaseInsensitive();
93                },
94                $this->part1
95            ),
96            array_map(
97                function (RegexPartInterface $part) {
98                    return $part->toCaseInsensitive();
99                },
100                $this->part2
101            )
102        );
103    }
104
105    public function toDotAll(): RegexPartInterface
106    {
107        return new MatchOrMatch(
108            array_map(
109                function (RegexPartInterface $part) {
110                    return $part->toDotAll();
111                },
112                $this->part1
113            ),
114            array_map(
115                function (RegexPartInterface $part) {
116                    return $part->toDotAll();
117                },
118                $this->part2
119            )
120        );
121    }
122
123    public function removeStartAndEndMarkers(): ?RegexPartInterface
124    {
125        return new MatchOrMatch(
126            array_filter(
127                array_map(
128                    function (RegexPartInterface $part) {
129                        return $part->removeStartAndEndMarkers();
130                    },
131                    $this->part1
132                )
133            ),
134            array_filter(
135                array_map(
136                    function (RegexPartInterface $part) {
137                        return $part->removeStartAndEndMarkers();
138                    },
139                    $this->part2
140                )
141            )
142        );
143    }
144}