miquido/data-structure

View on GitHub
src/Value/Scalar/Number/NumberValue.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace Miquido\DataStructure\Value\Scalar\Number;

use Webmozart\Assert\Assert;

final class NumberValue implements NumberValueInterface
{
    /**
     * @var int|float
     */
    private $number;

    public static function create($value): NumberValueInterface
    {
        return new NumberValue($value);
    }

    public function __construct($value)
    {
        Assert::numeric($value);

        $this->number = $value + 0; // cast to int or float
    }

    public function map(callable $callback): NumberValueInterface
    {
        return new NumberValue($callback($this->number));
    }

    public function int(bool $forceCast = true): int
    {
        if (!$forceCast) {
            Assert::integerish($this->number);
        }

        return (int) $this->number;
    }

    public function float(): float
    {
        return (float) $this->number;
    }

    /**
     * @return float|int
     */
    public function get()
    {
        return $this->number;
    }

    public function toScalar()
    {
        return $this->number;
    }
}