Skip to content

Instantly share code, notes, and snippets.

@ak4n
Forked from igorw/iterator-vs-generator.php
Last active August 29, 2015 14:22
Show Gist options
  • Select an option

  • Save ak4n/1da4432b638a7c1edc0c to your computer and use it in GitHub Desktop.

Select an option

Save ak4n/1da4432b638a7c1edc0c to your computer and use it in GitHub Desktop.

Revisions

  1. @igorw igorw revised this gist Dec 6, 2013. 1 changed file with 14 additions and 31 deletions.
    45 changes: 14 additions & 31 deletions iterator-vs-generator.php
    Original file line number Diff line number Diff line change
    @@ -1,56 +1,39 @@
    <?php

    // iterator impl:

    class MapIterator implements Iterator {
    class MapIterator extends IteratorIterator {
    private $f;
    private $inner;


    public function __construct($f, $inner) {
    parent::__construct($inner);
    $this->f = $f;
    $this->inner = $inner;
    }

    function rewind() {
    return $this->inner->rewind();
    }


    function current() {
    return call_user_func($this->f, $this->inner->current());
    }

    function key() {
    return $this->inner->key();
    }

    function next() {
    return $this->inner->next();
    }

    function valid() {
    return $this->inner->valid();
    return call_user_func($this->f, parent::current());
    }
    }

    function iter_map($f, $iter) {
    return new MapIterator($f, $iter);
    }

    // generator impl:

    function gen_map($f, $iter) {
    foreach ($iter as $k => $v) {
    yield $k => $f($v);
    }
    }

    // example:

    function times_two($x) {
    return $x * 2;
    }

    $source = new ArrayIterator([0, 1, 2, 3, 4, 5, 6]);

    var_dump(iterator_to_array(iter_map('times_two', $source)));
    var_dump(iterator_to_array(gen_map('times_two', $source)));
  2. @igorw igorw revised this gist Dec 5, 2013. 1 changed file with 6 additions and 0 deletions.
    6 changes: 6 additions & 0 deletions iterator-vs-generator.php
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,7 @@
    <?php

    // iterator impl:

    class MapIterator implements Iterator {
    private $f;
    private $inner;
    @@ -34,12 +36,16 @@ function iter_map($f, $iter) {
    return new MapIterator($f, $iter);
    }

    // generator impl:

    function gen_map($f, $iter) {
    foreach ($iter as $k => $v) {
    yield $k => $f($v);
    }
    }

    // example:

    function times_two($x) {
    return $x * 2;
    }
  3. @igorw igorw created this gist Dec 5, 2013.
    50 changes: 50 additions & 0 deletions iterator-vs-generator.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    <?php

    class MapIterator implements Iterator {
    private $f;
    private $inner;

    public function __construct($f, $inner) {
    $this->f = $f;
    $this->inner = $inner;
    }

    function rewind() {
    return $this->inner->rewind();
    }

    function current() {
    return call_user_func($this->f, $this->inner->current());
    }

    function key() {
    return $this->inner->key();
    }

    function next() {
    return $this->inner->next();
    }

    function valid() {
    return $this->inner->valid();
    }
    }

    function iter_map($f, $iter) {
    return new MapIterator($f, $iter);
    }

    function gen_map($f, $iter) {
    foreach ($iter as $k => $v) {
    yield $k => $f($v);
    }
    }

    function times_two($x) {
    return $x * 2;
    }

    $source = new ArrayIterator([0, 1, 2, 3, 4, 5, 6]);

    var_dump(iterator_to_array(iter_map('times_two', $source)));
    var_dump(iterator_to_array(gen_map('times_two', $source)));