Passed
Push — master ( d3a94c...76e109 )
by Valentin
05:50
created

Sequences   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 50
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
wmc 9
lcom 0
cbo 0
dl 0
loc 50
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
B find() 0 25 6
A skippedSequences() 0 11 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Cycle\ORM\Promise\ConflictResolver;
5
6
class Sequences
7
{
8
    /**
9
     * Examples:
10
     * [], <any> => 0
11
     *
12
     *
13
     * @param array $sequences
14
     * @param int   $originSequence
15
     *
16
     * @return int
17
     */
18
    public function find(array $sequences, int $originSequence): int
19
    {
20
        if (empty($sequences) || $originSequence > max($sequences)) {
21
            return $originSequence;
22
        }
23
24
        $gaps = $this->skippedSequences($sequences);
25
26
        if (isset($gaps[$originSequence])) {
27
            return $originSequence;
28
        }
29
30
        //we do not add "1" as postfix: $var, $var2, $var3, etc
31
        unset($gaps[1]);
32
        if (empty($gaps)) {
33
            $max = max($sequences);
34
            if ($max === 0) {
35
                return 2;
36
            }
37
38
            return $max + 1;
39
        }
40
41
        return min($gaps);
42
    }
43
44
    private function skippedSequences(array $sequences): array
45
    {
46
        $skipped = [];
47
        for ($i = 0; $i < max($sequences); $i++) {
48
            if (!in_array($i, $sequences)) {
49
                $skipped[$i] = $i;
50
            }
51
        }
52
53
        return $skipped;
54
    }
55
}