AbstractSortStrategy   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 82
Duplicated Lines 0 %

Test Coverage

Coverage 82.05%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 82
ccs 32
cts 39
cp 0.8205
rs 10
wmc 15

9 Methods

Rating   Name   Duplication   Size   Complexity  
A getOrder() 0 3 1
A __construct() 0 4 2
A setPreserveKeys() 0 4 1
A setOrder() 0 5 1
A getComparator() 0 3 1
A setComparator() 0 5 1
A sort() 0 6 2
A getValueChecker() 0 14 4
A createSortTransformFunction() 0 13 2
1
<?php
2
3
namespace Ninja\Sorter\Strategy;
4
5
use Closure;
6
use Ninja\Sorter\Comparator\ComparatorInterface;
7
use Ninja\Sorter\Comparator\UnicodeCIComparator;
0 ignored issues
show
Bug introduced by
The type Ninja\Sorter\Comparator\UnicodeCIComparator was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
use RuntimeException;
9
10
abstract class AbstractSortStrategy implements StrategyInterface
11
{
12
    private bool $preserve_keys = false;
13
14 3
    public function __construct(protected ?ComparatorInterface $comparator, private int $order = self::ASC)
15
    {
16 3
        if ($this->comparator === null) {
17
            $this->comparator = new UnicodeCIComparator();
18
        }
19
    }
20
21
    public function setComparator(ComparatorInterface $comparator): static
22
    {
23
        $this->comparator = $comparator;
24
25
        return $this;
26
    }
27
28 4
    protected function getComparator(): ?ComparatorInterface
29
    {
30 4
        return $this->comparator;
31
    }
32
33 2
    public function setOrder(int $order): static
34
    {
35 2
        $this->order = $order;
36
37 2
        return $this;
38
    }
39
40 1
    protected function getOrder(): int
41
    {
42 1
        return $this->order;
43
    }
44
45 1
    public function setPreserveKeys(bool $preserve_keys): static
46
    {
47 1
        $this->preserve_keys = $preserve_keys;
48 1
        return $this;
49
    }
50
51
    /**
52
     * @return Closure
53
     */
54 3
    protected function createSortTransformFunction(): Closure
55
    {
56 3
        $comparator = $this->getComparator();
57 3
        if ($comparator === null) {
58 3
            throw new RuntimeException('Comparator was not defined');
59
        }
60 3
61 3
        $checker   = $this->getValueChecker();
62 3
        $sortOrder = $this->order;
63 3
64
        return static function (mixed $a, mixed $b) use ($comparator, $checker, $sortOrder) {
65
            $checker($a, $b, $comparator);
66 4
            return $comparator->compare($a, $b) * $sortOrder;
67
        };
68 4
    }
69 4
70
    public function sort(array $collection): array
71 4
    {
72
        $function = $this->preserve_keys ? 'uasort' : 'usort';
73
        $function($collection, $this->createSortTransformFunction());
74 4
75
        return $collection;
76 4
    }
77 4
78
    protected function getValueChecker(): Closure
79 4
    {
80 4
        return static function (mixed $a, mixed $b, ComparatorInterface $comparator) {
81
            $exceptionMessage = 'Comparator (%s) does not support "%s"';
82 4
83
            $error = null;
84
            if (!$comparator->supports($a)) {
85
                $error = sprintf($exceptionMessage, get_class($comparator), gettype($a));
86 4
            } elseif (!$comparator->supports($b)) {
87
                $error = sprintf($exceptionMessage, get_class($comparator), gettype($a));
88
            }
89 4
90
            if ($error !== null) {
91
                throw new RuntimeException($error);
92
            }
93
        };
94
    }
95
}
96