Passed
Push — master ( a16e7b...0b226c )
by Arnold
07:52
created

iterable_sort()   B

Complexity

Conditions 9
Paths 112

Size

Total Lines 30
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 9.0101

Importance

Changes 0
Metric Value
cc 9
eloc 20
nc 112
nop 3
dl 0
loc 30
ccs 19
cts 20
cp 0.95
crap 9.0101
rs 7.9555
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Improved;
6
7
use function Jasny\expect_type;
8
9
/**
10
 * Sort all elements of an iterator.
11
 *
12
 * @param iterable     $iterable
13
 * @param callable|int $compare       SORT_* flag or callback comparator function
14
 * @param bool         $preserveKeys
15
 * @return \Generator
16
 */
17
function iterable_sort(iterable $iterable, $compare, bool $preserveKeys = false): \Generator
18
{
19 11
    expect_type(
20 11
        $compare,
21 11
        ['callable', 'int'],
22 11
        \TypeError::class,
23 11
        "Expected compare to be a callable or integer, %s given"
24
    );
25
26 11
    $comparator = is_int($compare) ? null : $compare;
27 11
    $flags = is_int($compare) ? $compare : 0;
28
29 11
    ['keys' => $keys, 'values' => $values] = $preserveKeys
30 3
        ? iterable_separate($iterable)
31 8
        : ['keys' => null, 'values' => is_array($iterable) ? $iterable : iterator_to_array($iterable, false)];
32
33 11
    if (!is_array($values)) {
34
        throw new \UnexpectedValueException("Values should be an array");
35
    }
36
37 11
    isset($comparator)
38 3
        ? uasort($values, $comparator)
39 8
        : asort($values, $flags);
40
41 11
    $counter = 0;
42 11
    unset($iterable);
43
44 11
    foreach ($values as $index => $value) {
45 10
        $key = isset($keys) ? $keys[$index] : $counter++;
46 10
        yield $key => $value;
47
    }
48
}
49