Completed
Pull Request — master (#7)
by ARCANEDEV
07:42
created

Distance::make()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 3
crap 1
1
<?php namespace Arcanedev\Units\Measures;
2
3
use Arcanedev\Units\Bases\UnitMeasure;
4
use Arcanedev\Units\Contracts\Measures\Distance as DistanceContract;
5
use Arcanedev\Units\Traits\Calculatable;
6
7
/**
8
 * Class     Distance
9
 *
10
 * @package  Arcanedev\Units\Measures
11
 * @author   ARCANEDEV <[email protected]>
12
 */
13
class Distance extends UnitMeasure implements DistanceContract
14
{
15
    /* ------------------------------------------------------------------------------------------------
16
     |  Traits
17
     | ------------------------------------------------------------------------------------------------
18
     */
19
    use Calculatable;
20
21
    /* ------------------------------------------------------------------------------------------------
22
     |  Constructor
23
     | ------------------------------------------------------------------------------------------------
24
     */
25
    /**
26
     * Distance constructor.
27
     *
28
     * @param  float|int  $value
29
     * @param  string     $unit
30
     * @param  array      $options
31
     */
32 328
    public function __construct($value = 0, $unit = self::M, array $options = [])
33
    {
34 328
        $this->init($value, $unit, $options);
35 328
    }
36
37
    /* ------------------------------------------------------------------------------------------------
38
     |  Getters & Setters
39
     | ------------------------------------------------------------------------------------------------
40
     */
41
    /**
42
     * Get the default names.
43
     *
44
     * @return array
45
     */
46 224
    public function defaultNames()
47
    {
48 224
        return array_combine(static::units(), [
49 224
            'kilometer',
50 168
            'hectometre',
51 168
            'decametre',
52 168
            'metre',
53 168
            'decimetre',
54 168
            'centimetre',
55 168
            'millimetre',
56 168
        ]);
57
    }
58
59
    /* ------------------------------------------------------------------------------------------------
60
     |  Main Functions
61
     | ------------------------------------------------------------------------------------------------
62
     */
63
    /**
64
     * Make a distance instance.
65
     *
66
     * @param  float|int  $value
67
     * @param  string     $unit
68
     * @param  array      $options
69
     *
70
     * @return static
71
     */
72 136
    public static function make($value = 0, $unit = self::M, array $options = [])
73
    {
74 136
        return parent::make($value, $unit, $options);
75
    }
76
77
    /* ------------------------------------------------------------------------------------------------
78
     |  Calculation Functions
79
     | ------------------------------------------------------------------------------------------------
80
     */
81
    /**
82
     * Add the distance.
83
     *
84
     * @param  float|int  $value
85
     * @param  string     $unit
86
     *
87
     * @return \Arcanedev\Units\Contracts\Measures\Distance
88
     */
89 32
    public function addDistance($value, $unit = self::M)
90
    {
91 32
        return $this->add(static::make($value, $unit));
92
    }
93
94
    /**
95
     * Sub the distance.
96
     *
97
     * @param  float|int  $value
98
     * @param  string     $unit
99
     *
100
     * @return \Arcanedev\Units\Contracts\Measures\Distance
101
     */
102 32
    public function subDistance($value, $unit = self::M)
103
    {
104 32
        return $this->sub(static::make($value, $unit));
105
    }
106
107
    /* ------------------------------------------------------------------------------------------------
108
     |  Other Functions
109
     | ------------------------------------------------------------------------------------------------
110
     */
111
    /**
112
     * Get all the distance ratios.
113
     *
114
     * @return array
115
     */
116 48
    protected static function getRatios()
117
    {
118 48
        $rate   = 10;
119
        $ratios = [
120 48
            static::KM  => 0,
121 48
            static::HM  => 1,
122 48
            static::DAM => 2,
123 48
            static::M   => 3,
124 48
            static::DM  => 4,
125 48
            static::CM  => 5,
126 48
            static::MM  => 6,
127 36
        ];
128
129 48
        return array_map(function ($ratio) use ($rate) {
130 48
            return static::calculate($rate, '^', $ratio);
131 48
        }, $ratios);
132
    }
133
}
134