Passed
Push — master ( 07fe92...9f0366 )
by oxidmod
06:46
created

AbstractCollection::getValueType()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 2
nc 2
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Oxidmod\TypedCollections\SimpleCollection;
5
6
abstract class AbstractCollection implements \Countable, \IteratorAggregate, \ArrayAccess
7
{
8
    private \Closure $typeChecker;
9
10
    protected array $items = [];
11
12
    public function __construct(\Closure $typeChecker, array $items = [])
13
    {
14
        $this->typeChecker = $typeChecker;
15
16
        foreach ($items as $k => $v) {
17
            $this->assertType($v);
18
            $this->items[$k] = $v;
19
        }
20
    }
21
22
    public function getIterator(): \Traversable
23
    {
24
        return new \ArrayIterator($this->items);
25
    }
26
27
    public function offsetExists($offset): bool
28
    {
29
        return array_key_exists($offset, $this->items);
30
    }
31
32
    public function offsetSet($offset, $value): void
33
    {
34
        $this->assertType($value);
35
36
        null === $offset ? $this->items[] = $value : $this->items[$offset] = $value;
37
    }
38
39
    public function offsetUnset($offset): void
40
    {
41
        if (array_key_exists($offset, $this->items)) {
42
            unset($this->items[$offset]);
43
        }
44
    }
45
46
    public function count(): int
47
    {
48
        return count($this->items);
49
    }
50
51
    protected function assertType($value): void
52
    {
53
        if (!$this->typeChecker->call($this, $value)) {
54
            throw new \InvalidArgumentException(
55
                sprintf('Value of type "%s" is not allowed for "%s"', $this->getValueType($value), static::class)
56
            );
57
        }
58
    }
59
60
    private function getValueType($value): string
61
    {
62
        if (is_object($value)) {
63
            return get_class($value);
64
        }
65
66
        return gettype($value);
67
    }
68
}
69