Driver   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 33
c 4
b 0
f 0
dl 0
loc 86
rs 10
wmc 14

9 Methods

Rating   Name   Duplication   Size   Complexity  
A remove() 0 6 2
A doRemove() 0 5 1
A add() 0 14 2
A has() 0 3 1
A erase() 0 4 2
A smallestInterval() 0 5 1
A __construct() 0 14 1
A update() 0 5 2
A render() 0 4 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AlecRabbit\Spinner\Core;
6
7
use AlecRabbit\Spinner\Contract\IDeltaTimer;
8
use AlecRabbit\Spinner\Contract\IInterval;
9
use AlecRabbit\Spinner\Contract\IObserver;
10
use AlecRabbit\Spinner\Contract\ISubject;
11
use AlecRabbit\Spinner\Core\A\ADriver;
12
use AlecRabbit\Spinner\Core\Contract\IDriverMessages;
13
use AlecRabbit\Spinner\Core\Contract\IIntervalComparator;
14
use AlecRabbit\Spinner\Core\Contract\IRenderer;
15
use AlecRabbit\Spinner\Core\Contract\ISpinner;
16
17
final class Driver extends ADriver
18
{
19
    private ?ISpinner $spinner = null;
20
21
    public function __construct(
22
        IInterval $initialInterval,
23
        IDriverMessages $driverMessages,
24
        IRenderer $renderer,
25
        private readonly IIntervalComparator $intervalComparator,
26
        IDeltaTimer $deltaTimer,
27
        ?IObserver $observer = null
28
    ) {
29
        parent::__construct(
30
            initialInterval: $initialInterval,
31
            driverMessages: $driverMessages,
32
            renderer: $renderer,
33
            deltaTimer: $deltaTimer,
34
            observer: $observer,
35
        );
36
    }
37
38
    public function add(ISpinner $spinner): void
39
    {
40
        $this->erase();
41
42
        if ($this->spinner) {
43
            $this->doRemove($this->spinner);
44
        }
45
46
        $this->spinner = $spinner;
47
48
        $this->render();
49
50
        $spinner->attach($this);
51
        $this->update($spinner);
52
    }
53
54
    protected function erase(): void
55
    {
56
        if ($this->spinner) {
57
            $this->renderer->erase($this->spinner);
58
        }
59
    }
60
61
    protected function doRemove(ISpinner $spinner): void
62
    {
63
        $spinner->detach($this);
64
        $this->spinner = null;
65
        $this->interval = $this->smallestInterval();
66
    }
67
68
    protected function smallestInterval(): IInterval
69
    {
70
        return $this->intervalComparator->smallest(
71
            $this->initialInterval,
72
            $this->spinner?->getInterval(),
73
        );
74
    }
75
76
    public function render(?float $dt = null): void
77
    {
78
        if ($this->spinner) {
79
            $this->renderer->render($this->spinner, $dt);
80
        }
81
    }
82
83
    public function update(ISubject $subject): void
84
    {
85
        if ($this->spinner === $subject) {
86
            $this->interval = $this->smallestInterval();
87
            $this->notify();
88
        }
89
    }
90
91
    public function remove(ISpinner $spinner): void
92
    {
93
        if ($this->spinner === $spinner) {
94
            $this->erase();
95
            $this->doRemove($spinner);
96
            $this->notify();
97
        }
98
    }
99
100
    public function has(ISpinner $spinner): bool
101
    {
102
        return $this->spinner === $spinner;
103
    }
104
}
105