<?php 
declare(strict_types=1); 
namespace ParagonIE\TypedArrays; 
 
abstract class AbstractTypedArray implements \ArrayAccess 
{ 
    protected array $contents = []; 
 
    protected const string SCALAR_TYPE = 'mixed'; 
 
    public function __debugInfo(): array 
    { 
        return $this->contents; 
    } 
 
    #[\Override] 
    public function offsetExists(mixed $offset): bool 
    { 
        return array_key_exists($offset, $this->contents); 
    } 
 
    #[\Override] 
    public function offsetGet(mixed $offset): mixed 
    { 
        if (!$this->offsetExists($offset)) { 
            throw new \RangeException('Index not found: ' . $offset); 
        } 
        return $this->contents[$offset]; 
    } 
 
    #[\Override] 
    public function offsetSet(mixed $offset, mixed $value): void 
    { 
        switch (static::SCALAR_TYPE) { 
            case 'mixed': 
                break; 
            case 'string': 
                if (!is_string($value)) { 
                    throw new \TypeError('Only ' . static::SCALAR_TYPE . ' types can be assigned'); 
                } 
                break; 
            case 'int': 
                if (!is_int($value)) { 
                    throw new \TypeError('Only ' . static::SCALAR_TYPE . ' types can be assigned'); 
                } 
                break; 
            case 'float': 
                if (!is_float($value) && !is_int($value)) { 
                    throw new \TypeError('Only ' . static::SCALAR_TYPE . ' types can be assigned'); 
                } 
                break; 
            case 'bool': 
                if (!is_bool($value)) { 
                    throw new \TypeError('Only ' . static::SCALAR_TYPE . ' types can be assigned'); 
                } 
                break; 
            case 'object': 
                if (!is_object($value)) { 
                    throw new \TypeError('Only ' . static::SCALAR_TYPE . ' types can be assigned'); 
                } 
                break; 
        } 
        $this->contents[$offset] = $value; 
    } 
 
    #[\Override] 
    public function offsetUnset(mixed $offset): void 
    { 
        if (array_key_exists($offset, $this->contents)) { 
            unset($this->contents[$offset]); 
        } 
    } 
} 
 
 |