Spinner::useStdOut()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 1
c 2
b 0
f 0
dl 0
loc 3
ccs 1
cts 1
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AlecRabbit\Snake;
6
7
use AlecRabbit\Snake\Contracts\Color;
8
use AlecRabbit\Snake\Contracts\SpinnerInterface;
9
use AlecRabbit\Snake\Core\Driver;
10
11
class Spinner implements SpinnerInterface
12
{
13
    private const CHARS = ['⠏', '⠛', '⠹', '⢸', '⣰', '⣤', '⣆', '⡇'];
14
    private const COLORS = [
15
        196,
16
        196,
17
        202,
18
        202,
19
        208,
20
        208,
21
        214,
22
        214,
23
        220,
24
        220,
25
        226,
26
        226,
27
        190,
28
        190,
29
        154,
30
        154,
31
        118,
32
        118,
33
        82,
34
        82,
35
        46,
36
        46,
37
        47,
38
        47,
39
        48,
40
        48,
41
        49,
42
        49,
43
        50,
44
        50,
45
        51,
46
        51,
47
        45,
48
        45,
49
        39,
50
        39,
51
        33,
52
        33,
53
        27,
54
        27,
55
        56,
56
        56,
57
        57,
58
        57,
59
        93,
60
        93,
61
        129,
62
        129,
63
        165,
64
        165,
65
        201,
66
        201,
67
        200,
68
        200,
69
        199,
70
        199,
71
        198,
72
        198,
73
        197,
74
        197,
75
    ];
76
77
    /** @var Driver */
78
    private $driver;
79
    /** @var int */
80
    private $currentCharIdx = 0;
81
    /** @var int */
82
    private $currentColorIdx = 0;
83
    /** @var int */
84
    private $framesCount;
85
    /** @var int */
86
    private $colorCount;
87
88 3
    public function __construct(int $colorLevel = Color::COLOR_256)
89
    {
90 3
        $this->driver = new Driver($colorLevel);
91 1
        $this->framesCount = count(self::CHARS);
92 1
        $this->colorCount = count(self::COLORS);
93 1
    }
94
95 1
    public function spin(): void
96
    {
97 1
        $this->driver->write(
98 1
            $this->driver->eraseSequence(),
99 1
            $this->driver->frameSequence(
100 1
                self::COLORS[$this->currentColorIdx],
101 1
                self::CHARS[$this->currentCharIdx]
102
            ),
103 1
            $this->driver->moveBackSequence()
104
        );
105 1
        $this->update();
106 1
    }
107
108 1
    private function update(): void
109
    {
110 1
        if (++$this->currentCharIdx === $this->framesCount) {
111 1
            $this->currentCharIdx = 0;
112
        }
113 1
        if (++$this->currentColorIdx === $this->colorCount) {
114
            $this->currentColorIdx = 0;
115
        }
116 1
    }
117
118
    /** @inheritDoc */
119
    public function interval(): float
120
    {
121
        return 0.1;
122 1
    }
123
124 1
    public function begin(): void
125
    {
126
        $this->driver->hideCursor();
127 1
    }
128
129 1
    public function end(): void
130 1
    {
131
        $this->erase();
132 1
        $this->driver->showCursor();
133
    }
134 1
135 1
    public function erase(): void
136 1
    {
137
        $this->driver->write(
138 1
            $this->driver->eraseSequence()
139
        );
140 1
    }
141 1
142
    public function useStdOut(): void
143 1
    {
144
        $this->driver->useStdOut();
145
    }
146
}
147