miquido/data-structure

View on GitHub
src/Value/Collection/CollectionValue.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace Miquido\DataStructure\Value\Collection;

use Miquido\DataStructure\ArrayConverter;
use Miquido\DataStructure\TypedCollection\IntegerCollection;
use Miquido\DataStructure\TypedCollection\IntegerCollectionInterface;
use Miquido\DataStructure\TypedCollection\NumberCollection;
use Miquido\DataStructure\TypedCollection\NumberCollectionInterface;
use Miquido\DataStructure\TypedCollection\ObjectCollection;
use Miquido\DataStructure\TypedCollection\ObjectCollectionInterface;
use Miquido\DataStructure\TypedCollection\StringCollection;
use Miquido\DataStructure\TypedCollection\StringCollectionInterface;
use Miquido\DataStructure\Value\Scalar\Number\NumberValue;
use Miquido\DataStructure\Value\Scalar\String\StringValue;
use Webmozart\Assert\Assert;

final class CollectionValue implements CollectionValueInterface
{
    /**
     * @var array
     */
    private $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function strings(): StringCollectionInterface
    {
        return new StringCollection(...\array_map(
            function ($value): string {
                return StringValue::create($value)->get();
            },
            $this->values()
        ));
    }

    public function numbers(): NumberCollectionInterface
    {
        return new NumberCollection(...\array_map(
            function ($value): float {
                return NumberValue::create($value)->float();
            },
            $this->values()
        ));
    }

    public function integers(bool $forceCast = true): IntegerCollectionInterface
    {
        return new IntegerCollection(...\array_map(
            function ($value) use ($forceCast): int {
                return NumberValue::create($value)->int($forceCast);
            },
            $this->values()
        ));
    }

    public function objects(): ObjectCollectionInterface
    {
        $values = $this->values();
        Assert::allObject($values);

        return new ObjectCollection(...$values);
    }

    public function get(): array
    {
        return $this->data;
    }

    public function keys(): array
    {
        return \array_keys($this->data);
    }

    public function values(): array
    {
        return \array_values($this->data);
    }

    public function count(): int
    {
        return \count($this->data);
    }

    public function toArray(): array
    {
        return ArrayConverter::toArray($this->data);
    }

    /**
     * @return \Traversable
     */
    public function getIterator(): \Traversable
    {
        return new \ArrayIterator($this->data);
    }
}