Completed
Push — master ( 166d1e...c5a3b4 )
by Arne
02:18
created

getSynchronizationsByIdentity()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace Archivr;
4
5
use Archivr\Exception\Exception;
6
7
class SynchronizationList implements \Countable, \IteratorAggregate
8
{
9
    /**
10
     * Chronologically ordered list of synchronizations (earliest to latest).
11
     *
12
     * @var Synchronization[]
13
     */
14
    protected $synchronizations = [];
15
16
    /**
17
     * @param Synchronization[] $synchronizations
18
     */
19
    public function __construct(array $synchronizations = [])
20
    {
21
        foreach ($synchronizations as $synchronization)
22
        {
23
            $this->addSynchronization($synchronization);
24
        }
25
    }
26
27
    /**
28
     * @param Synchronization $synchronization
29
     *
30
     * @return SynchronizationList
31
     * @throws Exception
32
     */
33
    public function addSynchronization(Synchronization $synchronization): SynchronizationList
34
    {
35
        if (isset($this->synchronizations[$synchronization->getRevision()]))
36
        {
37
            throw new Exception();
38
        }
39
40
        $this->synchronizations[$synchronization->getRevision()] = $synchronization;
41
42
        return $this;
43
    }
44
45
    /**
46
     * @return Synchronization
47
     */
48
    public function getLastSynchronization()
49
    {
50
        return empty($this->synchronizations) ? null : $this->synchronizations[count($this->synchronizations)];
51
    }
52
53
    /**
54
     * @param int $revision
55
     *
56
     * @return Synchronization
57
     */
58
    public function getSynchronizationByRevision(int $revision)
59
    {
60
        return isset($this->synchronizations[$revision]) ? $this->synchronizations[$revision] : null;
61
    }
62
63
    /**
64
     * Returns the synchronization that was the current one for the given date.
65
     *
66
     * @param \DateTime $time
67
     *
68
     * @return Synchronization
69
     */
70
    public function getSynchronizationByTime(\DateTime $time)
71
    {
72
        $current = null;
73
74
        foreach ($this->synchronizations as $synchronization)
75
        {
76
            if ($synchronization->getTime() > $time)
77
            {
78
                break;
79
            }
80
81
            $current = $synchronization;
82
        }
83
84
        return $current;
85
    }
86
87
    /**
88
     * Returns new synchronization list containing only those synchronizations that were performed by the given identity.
89
     *
90
     * @param string $identity
91
     * @return SynchronizationList
92
     */
93
    public function getSynchronizationsByIdentity(string $identity): SynchronizationList
94
    {
95
        return new static(array_filter(iterator_to_array($this->getIterator()), function(Synchronization $synchronization) use ($identity) {
96
97
            return $synchronization->getIdentity() === $identity;
98
        }));
99
    }
100
101
    /**
102
     * Returns set of revisions contained in this list.
103
     *
104
     * @return int[]
105
     */
106
    public function getRevisions(): array
107
    {
108
        return array_values(array_map(function(Synchronization $synchronization) {
109
110
            return $synchronization->getRevision();
111
112
        }, iterator_to_array($this->getIterator())));
113
    }
114
115
    /**
116
     * {@inheritdoc}
117
     */
118
    public function count(): int
119
    {
120
        return count($this->synchronizations);
121
    }
122
123
    /**
124
     * {@inheritdoc}
125
     */
126
    public function getIterator(): \Traversable
127
    {
128
        return new \ArrayIterator($this->synchronizations);
129
    }
130
}
131