TransitionEventCollection::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2.1481

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
ccs 2
cts 3
cp 0.6667
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2.1481
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Dflydev\FiniteStateMachine\TransitionEvent;
6
7
use Dflydev\FiniteStateMachine\Contracts\Event;
8
9
class TransitionEventCollection
10
{
11
    /**
12
     * @var array <int, TransitionEvent>
13
     */
14
    private array $transitionEvents = [];
15
16
    /**
17
     * @var array <string, array<string, TransitionEvent>>
18
     */
19
    private array $transitionEventsByWhenAndName = [];
20
21 21
    public function __construct(TransitionEvent ...$transitionEvents)
22
    {
23 21
        foreach ($transitionEvents as $transitionEvent) {
24
            $this->add($transitionEvent);
25
        }
26 21
    }
27
28 21
    public function add(TransitionEvent $transitionEvent): void
29
    {
30 21
        $this->transitionEvents[] = $transitionEvent;
31
32 21
        if (!array_key_exists($transitionEvent->when(), $this->transitionEventsByWhenAndName)) {
33 21
            $this->transitionEventsByWhenAndName[$transitionEvent->when()] = [];
34
        }
35
36 21
        $this->transitionEventsByWhenAndName[$transitionEvent->when()][$transitionEvent->name()] = $transitionEvent;
37 21
    }
38
39 7
    public function fireIfMatches(Event $event): void
40
    {
41 7
        if (! isset($this->transitionEventsByWhenAndName[$event->when()])) {
42
            return;
43
        }
44
45
        /** @var TransitionEvent[] $transitionEvents */
46 7
        $transitionEvents = $this->transitionEventsByWhenAndName[$event->when()];
47
48 7
        foreach ($transitionEvents as $transitionEvent) {
49 7
            $transitionEvent->fireIfMatches(
50 7
                $event->when(),
51 7
                $event->object(),
52 7
                $event->transition(),
53 7
                $event->fromState(),
54 7
                $event->toState()
55
            );
56
        }
57 7
    }
58
}
59