TransitionEventCollection::fireIfMatches()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3.0067

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 16
ccs 10
cts 11
cp 0.9091
rs 9.9332
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 3.0067
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