TransitionCollection::named()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2.0625

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 7
ccs 3
cts 4
cp 0.75
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2.0625
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Dflydev\FiniteStateMachine\Transition;
6
7
use Dflydev\FiniteStateMachine\State\State;
8
9
class TransitionCollection
10
{
11
    /**
12
     * @var array<int, Transition>
13
     */
14
    private array $transitions = [];
15
16
    /**
17
     * @var array<string, Transition>
18
     */
19
    private array $transitionsByName = [];
20
21 21
    public function __construct(Transition ...$transitions)
22
    {
23 21
        foreach ($transitions as $transition) {
24 7
            $this->add($transition);
25
        }
26 21
    }
27
28 21
    public function add(Transition $transition): void
29
    {
30 21
        $this->transitions[] = $transition;
31 21
        $this->transitionsByName[$transition->name()] = $transition;
32 21
    }
33
34 14
    public function named(string $name): Transition
35
    {
36 14
        if (! isset($this->transitionsByName[$name])) {
37
            throw new \RuntimeException(sprintf('No transition named "%s"', $name));
38
        }
39
40 14
        return $this->transitionsByName[$name];
41
    }
42
43 7
    public function names(): array
44
    {
45 7
        return array_keys($this->transitionsByName);
46
    }
47
48 8
    public function fromState(State $state): self
49
    {
50
        /** @var Transition[] $transitions */
51 8
        $transitions = array_filter(
52 8
            $this->transitions,
53 8
            fn(Transition $transition) => $transition->canTransitionFrom($state)
54 8
        );
55
56 8
        return new static(...$transitions);
57
    }
58
}
59