Iter.php 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <?php
  2. namespace MathPHP\Util;
  3. /**
  4. * @internal
  5. */
  6. class Iter
  7. {
  8. /**
  9. * Zip - Make an iterator that aggregates items from multiple iterators
  10. * Similar to Python's zip function
  11. * @internal
  12. *
  13. * @param iterable<mixed> ...$iterables
  14. *
  15. * @return \MultipleIterator
  16. */
  17. public static function zip(iterable ...$iterables): \MultipleIterator
  18. {
  19. $zippedIterator = new \MultipleIterator();
  20. foreach ($iterables as $iterable) {
  21. $zippedIterator->attachIterator(self::makeIterator($iterable));
  22. }
  23. return $zippedIterator;
  24. }
  25. /**
  26. * @param iterable<mixed> $iterable
  27. *
  28. * @return \Iterator|\IteratorIterator|\ArrayIterator
  29. */
  30. private static function makeIterator(iterable $iterable): \Iterator
  31. {
  32. switch (true) {
  33. case $iterable instanceof \Iterator:
  34. return $iterable;
  35. case $iterable instanceof \Traversable:
  36. return new \IteratorIterator($iterable);
  37. case \is_array($iterable):
  38. return new \ArrayIterator($iterable);
  39. }
  40. throw new \LogicException(\gettype($iterable) . ' type is not an expected iterable type (Iterator|Traversable|array)');
  41. }
  42. }