aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Enderlin <ivan.enderlin@hoa-project.net>2014-09-29 09:34:07 +0200
committerIvan Enderlin <ivan.enderlin@hoa-project.net>2014-09-29 09:42:58 +0200
commit30136ca74311c60043eb9c07180f165b9cc1c081 (patch)
tree63b961d5007f8062cc09b6ef365dc32b096e658a
parent675d0600078f26997f08f9e183bf33d00e824337 (diff)
downloadIterator-30136ca74311c60043eb9c07180f165b9cc1c081.zip
Iterator-30136ca74311c60043eb9c07180f165b9cc1c081.tar.gz
Iterator-30136ca74311c60043eb9c07180f165b9cc1c081.tar.bz2
Add the CallbackGenerator iterator.
-rw-r--r--CallbackGenerator.php149
-rw-r--r--README.md22
2 files changed, 171 insertions, 0 deletions
diff --git a/CallbackGenerator.php b/CallbackGenerator.php
new file mode 100644
index 0000000..79f719c
--- /dev/null
+++ b/CallbackGenerator.php
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * Hoa
+ *
+ *
+ * @license
+ *
+ * New BSD License
+ *
+ * Copyright © 2007-2014, Ivan Enderlin. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the Hoa nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+namespace Hoa\Iterator;
+
+/**
+ * Class \Hoa\Iterator\CallbackGenerator.
+ *
+ * Yield a value based on a callback.
+ *
+ * @author Ivan Enderlin <ivan.enderlin@hoa-project.net>
+ * @copyright Copyright © 2007-2014 Ivan Enderlin.
+ * @license New BSD License
+ */
+
+class CallbackGenerator implements Iterator {
+
+ /**
+ * Callback.
+ *
+ * @var \Hoa\Iterator\CallbackGenerator callable
+ */
+ protected $_callback = null;
+
+ /**
+ * Current key.
+ *
+ * @var \Hoa\Iterator\Demultiplexer mixed
+ */
+ protected $_key = 0;
+
+ /**
+ * Current computed value.
+ *
+ * @var \Hoa\Iterator\Demultiplexer mixed
+ */
+ protected $_current = null;
+
+
+
+ /**
+ * Constructor.
+ *
+ * @access public
+ * @param callable $callback Callback.
+ * @return void
+ */
+ public function __construct ( Callable $callback ) {
+
+ $this->_callback = $callback;
+
+ return;
+ }
+
+ /**
+ * Return the current element.
+ *
+ * @access public
+ * @return mixed
+ */
+ public function current ( ) {
+
+ $handle = $this->_callback;
+
+ return $this->_current = $handle($this->_key);
+ }
+
+ /**
+ * Return the key of the current element.
+ *
+ * @access public
+ * @return mixed
+ */
+ public function key ( ) {
+
+ return $this->_key;
+ }
+
+ /**
+ * Move forward to next element.
+ *
+ * @access public
+ * @return void
+ */
+ public function next ( ) {
+
+ ++$this->_key;
+
+ return;
+ }
+
+ /**
+ * Rewind the iterator to the first element.
+ *
+ * @access public
+ * @return void
+ */
+ public function rewind ( ) {
+
+ $this->_key = 0;
+ $this->_current = null;
+
+ return;
+ }
+
+ /**
+ * Check if current position is valid.
+ *
+ * @access public
+ * @return bool
+ */
+ public function valid ( ) {
+
+ return true;
+ }
+}
diff --git a/README.md b/README.md
index 117fba5..7fb6e06 100644
--- a/README.md
+++ b/README.md
@@ -338,6 +338,28 @@ foreach($lookahead as $value) {
*/
```
+### Callback generator
+
+`Hoa\Iterator\CallbackGenerator` allows to transform any callable into an
+iterator. This is very useful when combined with other iterators, for instance
+with `Hoa\Iterator\Limit`:
+
+```php
+$generator = new Hoa\Iterator\CallbackGenerator(function ( $key ) {
+
+ return mt_rand($key, $key * 2);
+});
+$limit = new Hoa\Iterator\Limit($generator, 0, 10);
+
+foreach($limit as $value)
+ echo $value, ' ';
+
+/**
+ * Could output:
+ * 0 2 3 4 4 7 8 10 12 18
+ */
+```
+
### Recursive iterators
A recursive iterator is an iterator where its values is other iterators. The