1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
<?php
namespace esperecyan\webidl\lib;
class SequenceType
{
use Utility;
public static function convertToRewindable($traversable)
{
while ($traversable instanceof \IteratorAggregate) {
$traversable = $traversable->getIterator();
}
if ($traversable instanceof \Iterator) {
try {
$traversable->rewind();
if (!$traversable->valid()) {
$traversable = [];
}
} catch (\Exception $exception) {
$traversable = $traversable->valid() ? new \NoRewindIterator($traversable) : [];
}
}
return $traversable instanceof \Traversable ? $traversable : (array)$traversable;
}
public static function toSequence($traversable, $type, $pseudoTypes = [])
{
$array = [];
foreach (self::convertToRewindable($traversable) as $value) {
try {
$array[] = Type::to($type, $value, $pseudoTypes);
} catch (\LogicException $exception) {
if ($exception instanceof \InvalidArgumentException || $exception instanceof \DomainException) {
throw new \DomainException(ErrorMessageCreator::create(
null,
sprintf('%s (an array including only %s)', 'sequence<' . $type . '>', $type),
''
), 0, $exception);
} else {
throw $exception;
}
}
}
return $array;
}
public static function toFrozenArray($traversable, $type, $pseudoTypes = [])
{
return self::toSequence($traversable, $type, $pseudoTypes);
}
}