StateRepresentation::add()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 11
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 16
rs 9.9
1
<?php declare(strict_types=1);
2
3
namespace Stratadox\EntityState;
4
5
use function is_string;
6
use Stratadox\IdentityMap\MapsObjectsByIdentity;
7
8
final class StateRepresentation implements State
9
{
10
    private $entityStates;
11
    private $map;
12
13
    public function __construct(
14
        ListsEntityStates $entities,
15
        MapsObjectsByIdentity $map
16
    ) {
17
        $this->entityStates = $entities;
18
        $this->map = $map;
19
    }
20
21
    public static function with(
22
        ListsEntityStates $entities,
23
        MapsObjectsByIdentity $map
24
    ): State {
25
        return new self($entities, $map);
26
    }
27
28
    public function entityStates(): ListsEntityStates
29
    {
30
        return $this->entityStates;
31
    }
32
33
    public function identityMap(): MapsObjectsByIdentity
34
    {
35
        return $this->map;
36
    }
37
38
    public function add(State $additional): State
39
    {
40
        $entityStates = $this->entityStates;
41
        $map = $this->map;
42
        foreach ($additional->entityStates() as $entityState) {
43
            $entityStates = $entityStates->add($entityState);
44
            if (is_string($entityState->id())) {
45
                $map = $this->addToMapIfNew(
46
                    $map,
47
                    $additional->identityMap(),
48
                    $entityState->class(),
49
                    $entityState->id()
50
                );
51
            }
52
        }
53
        return new self($entityStates, $map);
54
    }
55
56
    public function changesSince(State $previous): TellsWhatChanged
57
    {
58
        return $this->entityStates->changesSince($previous->entityStates());
59
    }
60
61
    public function offsetExists($offset): bool
62
    {
63
        return $this->entityStates->offsetExists($offset);
64
    }
65
66
    public function offsetGet($offset): RepresentsEntity
67
    {
68
        return $this->entityStates->offsetGet($offset);
69
    }
70
71
    public function offsetSet($offset, $value): void
72
    {
73
        $this->entityStates->offsetSet($offset, $value);
74
    }
75
76
    public function offsetUnset($offset): void
77
    {
78
        $this->entityStates->offsetUnset($offset);
79
    }
80
81
    public function next(): void
82
    {
83
        $this->entityStates->next();
84
    }
85
86
    public function key(): int
87
    {
88
        return $this->entityStates->key();
89
    }
90
91
    public function valid(): bool
92
    {
93
        return $this->entityStates->valid();
94
    }
95
96
    public function rewind(): void
97
    {
98
        $this->entityStates->rewind();
99
    }
100
101
    public function current(): RepresentsEntity
102
    {
103
        return $this->entityStates->current();
104
    }
105
106
    public function count(): int
107
    {
108
        return $this->entityStates->count();
109
    }
110
111
    private function addToMapIfNew(
112
        MapsObjectsByIdentity $map,
113
        MapsObjectsByIdentity $additionalMap,
114
        string $class,
115
        string $id
116
    ): MapsObjectsByIdentity {
117
        if ($map->has($class, $id)) {
118
            return $map;
119
        }
120
        return $map->add(
121
            $id,
122
            $additionalMap->get($class, $id)
123
        );
124
    }
125
}
126