| 
<?phpdeclare(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]);
 }
 }
 }
 
 |