Sequences::find()   B
last analyzed

Complexity

Conditions 6
Paths 5

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 25
rs 8.8977
c 0
b 0
f 0
cc 6
nc 5
nop 2
1
<?php
2
3
/**
4
 * Spiral Framework. Cycle ProxyFactory
5
 *
6
 * @license MIT
7
 * @author  Valentin V (Vvval)
8
 */
9
10
declare(strict_types=1);
11
12
namespace Cycle\ORM\Promise\ConflictResolver;
13
14
final class Sequences
15
{
16
    /**
17
     * Examples:
18
     * [], <any> => 0
19
     *
20
     *
21
     * @param array $sequences
22
     * @param int   $originSequence
23
     * @return int
24
     */
25
    public function find(array $sequences, int $originSequence): int
26
    {
27
        if (empty($sequences) || $originSequence > max($sequences)) {
28
            return $originSequence;
29
        }
30
31
        $gaps = $this->skippedSequences($sequences);
32
33
        if (isset($gaps[$originSequence])) {
34
            return $originSequence;
35
        }
36
37
        //we do not add "1" as postfix: $var, $var2, $var3, etc
38
        unset($gaps[1]);
39
        if (empty($gaps)) {
40
            $max = max($sequences);
41
            if ($max === 0) {
42
                return 2;
43
            }
44
45
            return $max + 1;
46
        }
47
48
        return min($gaps);
49
    }
50
51
    /**
52
     * @param array $sequences
53
     * @return array
54
     */
55
    private function skippedSequences(array $sequences): array
56
    {
57
        $skipped = [];
58
        $max = max($sequences);
59
60
        for ($i = 0; $i < $max; $i++) {
61
            if (!in_array($i, $sequences, true)) {
62
                $skipped[$i] = $i;
63
            }
64
        }
65
66
        return $skipped;
67
    }
68
}
69