1<?php 2 3/** 4 * Hoa 5 * 6 * 7 * @license 8 * 9 * New BSD License 10 * 11 * Copyright © 2007-2017, Hoa community. All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions are met: 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * * Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * * Neither the name of the Hoa nor the names of its contributors may be 21 * used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE 28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37namespace Hoa\Iterator; 38 39/** 40 * Class \Hoa\Iterator\Lookbehind. 41 * 42 * Look behind iterator. 43 * 44 * @copyright Copyright © 2007-2017 Hoa community 45 * @license New BSD License 46 */ 47class Lookbehind extends IteratorIterator implements Outer 48{ 49 /** 50 * Current iterator. 51 * 52 * @var \Iterator 53 */ 54 protected $_iterator = null; 55 56 /** 57 * Previous key. 58 * 59 * @var mixed 60 */ 61 protected $_previousKey = -1; 62 63 /** 64 * Previous value. 65 * 66 * @var mixed 67 */ 68 protected $_previousCurrent = null; 69 70 71 72 /** 73 * Construct. 74 * 75 * @param \Iterator $iterator Iterator. 76 */ 77 public function __construct(\Iterator $iterator) 78 { 79 $this->_iterator = $iterator; 80 81 return; 82 } 83 84 /** 85 * Get inner iterator. 86 * 87 * @return \Iterator 88 */ 89 public function getInnerIterator() 90 { 91 return $this->_iterator; 92 } 93 94 /** 95 * Return the current element. 96 * 97 * @return mixed 98 */ 99 public function current() 100 { 101 return $this->getInnerIterator()->current(); 102 } 103 104 /** 105 * Return the key of the current element. 106 * 107 * @return mixed 108 */ 109 public function key() 110 { 111 return $this->getInnerIterator()->key(); 112 } 113 114 /** 115 * Move forward to next element. 116 * 117 * @return void 118 */ 119 public function next() 120 { 121 $this->_previousKey = $this->key(); 122 $this->_previousCurrent = $this->current(); 123 124 return $this->getInnerIterator()->next(); 125 } 126 127 /** 128 * Rewind the iterator to the first element. 129 * 130 * @return void 131 */ 132 public function rewind() 133 { 134 $this->_previousKey = -1; 135 $this->_previousCurrent = null; 136 137 return $this->getInnerIterator()->rewind(); 138 } 139 140 /** 141 * Check if current position is valid. 142 * 143 * @return bool 144 */ 145 public function valid() 146 { 147 return $this->getInnerIterator()->valid(); 148 } 149 150 /** 151 * Check whether there is a previous element. 152 * 153 * @return bool 154 */ 155 public function hasPrevious() 156 { 157 return -1 !== $this->_previousKey; 158 } 159 160 /** 161 * Get previous value. 162 * 163 * @return mixed 164 */ 165 public function getPrevious() 166 { 167 return $this->_previousCurrent; 168 } 169 170 /** 171 * Get previous key. 172 * 173 * @return mixed 174 */ 175 public function getPreviousKey() 176 { 177 return $this->_previousKey; 178 } 179} 180