Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
Chris@0
|
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
Chris@0
|
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
Chris@0
|
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
Chris@0
|
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
Chris@0
|
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
Chris@0
|
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
Chris@0
|
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
Chris@0
|
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
Chris@0
|
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
Chris@0
|
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
Chris@0
|
14 *
|
Chris@0
|
15 * This software consists of voluntary contributions made by many individuals
|
Chris@0
|
16 * and is licensed under the MIT license. For more information, see
|
Chris@0
|
17 * <http://www.doctrine-project.org>.
|
Chris@0
|
18 */
|
Chris@0
|
19
|
Chris@0
|
20 namespace Doctrine\Common\Collections;
|
Chris@0
|
21
|
Chris@0
|
22 use Closure;
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * Lazy collection that is backed by a concrete collection
|
Chris@0
|
26 *
|
Chris@0
|
27 * @author Michaƫl Gallego <mic.gallego@gmail.com>
|
Chris@0
|
28 * @since 1.2
|
Chris@0
|
29 */
|
Chris@0
|
30 abstract class AbstractLazyCollection implements Collection
|
Chris@0
|
31 {
|
Chris@0
|
32 /**
|
Chris@0
|
33 * The backed collection to use
|
Chris@0
|
34 *
|
Chris@0
|
35 * @var Collection
|
Chris@0
|
36 */
|
Chris@0
|
37 protected $collection;
|
Chris@0
|
38
|
Chris@0
|
39 /**
|
Chris@0
|
40 * @var boolean
|
Chris@0
|
41 */
|
Chris@0
|
42 protected $initialized = false;
|
Chris@0
|
43
|
Chris@0
|
44 /**
|
Chris@0
|
45 * {@inheritDoc}
|
Chris@0
|
46 */
|
Chris@0
|
47 public function count()
|
Chris@0
|
48 {
|
Chris@0
|
49 $this->initialize();
|
Chris@0
|
50 return $this->collection->count();
|
Chris@0
|
51 }
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * {@inheritDoc}
|
Chris@0
|
55 */
|
Chris@0
|
56 public function add($element)
|
Chris@0
|
57 {
|
Chris@0
|
58 $this->initialize();
|
Chris@0
|
59 return $this->collection->add($element);
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@0
|
62 /**
|
Chris@0
|
63 * {@inheritDoc}
|
Chris@0
|
64 */
|
Chris@0
|
65 public function clear()
|
Chris@0
|
66 {
|
Chris@0
|
67 $this->initialize();
|
Chris@0
|
68 $this->collection->clear();
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 /**
|
Chris@0
|
72 * {@inheritDoc}
|
Chris@0
|
73 */
|
Chris@0
|
74 public function contains($element)
|
Chris@0
|
75 {
|
Chris@0
|
76 $this->initialize();
|
Chris@0
|
77 return $this->collection->contains($element);
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 /**
|
Chris@0
|
81 * {@inheritDoc}
|
Chris@0
|
82 */
|
Chris@0
|
83 public function isEmpty()
|
Chris@0
|
84 {
|
Chris@0
|
85 $this->initialize();
|
Chris@0
|
86 return $this->collection->isEmpty();
|
Chris@0
|
87 }
|
Chris@0
|
88
|
Chris@0
|
89 /**
|
Chris@0
|
90 * {@inheritDoc}
|
Chris@0
|
91 */
|
Chris@0
|
92 public function remove($key)
|
Chris@0
|
93 {
|
Chris@0
|
94 $this->initialize();
|
Chris@0
|
95 return $this->collection->remove($key);
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * {@inheritDoc}
|
Chris@0
|
100 */
|
Chris@0
|
101 public function removeElement($element)
|
Chris@0
|
102 {
|
Chris@0
|
103 $this->initialize();
|
Chris@0
|
104 return $this->collection->removeElement($element);
|
Chris@0
|
105 }
|
Chris@0
|
106
|
Chris@0
|
107 /**
|
Chris@0
|
108 * {@inheritDoc}
|
Chris@0
|
109 */
|
Chris@0
|
110 public function containsKey($key)
|
Chris@0
|
111 {
|
Chris@0
|
112 $this->initialize();
|
Chris@0
|
113 return $this->collection->containsKey($key);
|
Chris@0
|
114 }
|
Chris@0
|
115
|
Chris@0
|
116 /**
|
Chris@0
|
117 * {@inheritDoc}
|
Chris@0
|
118 */
|
Chris@0
|
119 public function get($key)
|
Chris@0
|
120 {
|
Chris@0
|
121 $this->initialize();
|
Chris@0
|
122 return $this->collection->get($key);
|
Chris@0
|
123 }
|
Chris@0
|
124
|
Chris@0
|
125 /**
|
Chris@0
|
126 * {@inheritDoc}
|
Chris@0
|
127 */
|
Chris@0
|
128 public function getKeys()
|
Chris@0
|
129 {
|
Chris@0
|
130 $this->initialize();
|
Chris@0
|
131 return $this->collection->getKeys();
|
Chris@0
|
132 }
|
Chris@0
|
133
|
Chris@0
|
134 /**
|
Chris@0
|
135 * {@inheritDoc}
|
Chris@0
|
136 */
|
Chris@0
|
137 public function getValues()
|
Chris@0
|
138 {
|
Chris@0
|
139 $this->initialize();
|
Chris@0
|
140 return $this->collection->getValues();
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * {@inheritDoc}
|
Chris@0
|
145 */
|
Chris@0
|
146 public function set($key, $value)
|
Chris@0
|
147 {
|
Chris@0
|
148 $this->initialize();
|
Chris@0
|
149 $this->collection->set($key, $value);
|
Chris@0
|
150 }
|
Chris@0
|
151
|
Chris@0
|
152 /**
|
Chris@0
|
153 * {@inheritDoc}
|
Chris@0
|
154 */
|
Chris@0
|
155 public function toArray()
|
Chris@0
|
156 {
|
Chris@0
|
157 $this->initialize();
|
Chris@0
|
158 return $this->collection->toArray();
|
Chris@0
|
159 }
|
Chris@0
|
160
|
Chris@0
|
161 /**
|
Chris@0
|
162 * {@inheritDoc}
|
Chris@0
|
163 */
|
Chris@0
|
164 public function first()
|
Chris@0
|
165 {
|
Chris@0
|
166 $this->initialize();
|
Chris@0
|
167 return $this->collection->first();
|
Chris@0
|
168 }
|
Chris@0
|
169
|
Chris@0
|
170 /**
|
Chris@0
|
171 * {@inheritDoc}
|
Chris@0
|
172 */
|
Chris@0
|
173 public function last()
|
Chris@0
|
174 {
|
Chris@0
|
175 $this->initialize();
|
Chris@0
|
176 return $this->collection->last();
|
Chris@0
|
177 }
|
Chris@0
|
178
|
Chris@0
|
179 /**
|
Chris@0
|
180 * {@inheritDoc}
|
Chris@0
|
181 */
|
Chris@0
|
182 public function key()
|
Chris@0
|
183 {
|
Chris@0
|
184 $this->initialize();
|
Chris@0
|
185 return $this->collection->key();
|
Chris@0
|
186 }
|
Chris@0
|
187
|
Chris@0
|
188 /**
|
Chris@0
|
189 * {@inheritDoc}
|
Chris@0
|
190 */
|
Chris@0
|
191 public function current()
|
Chris@0
|
192 {
|
Chris@0
|
193 $this->initialize();
|
Chris@0
|
194 return $this->collection->current();
|
Chris@0
|
195 }
|
Chris@0
|
196
|
Chris@0
|
197 /**
|
Chris@0
|
198 * {@inheritDoc}
|
Chris@0
|
199 */
|
Chris@0
|
200 public function next()
|
Chris@0
|
201 {
|
Chris@0
|
202 $this->initialize();
|
Chris@0
|
203 return $this->collection->next();
|
Chris@0
|
204 }
|
Chris@0
|
205
|
Chris@0
|
206 /**
|
Chris@0
|
207 * {@inheritDoc}
|
Chris@0
|
208 */
|
Chris@0
|
209 public function exists(Closure $p)
|
Chris@0
|
210 {
|
Chris@0
|
211 $this->initialize();
|
Chris@0
|
212 return $this->collection->exists($p);
|
Chris@0
|
213 }
|
Chris@0
|
214
|
Chris@0
|
215 /**
|
Chris@0
|
216 * {@inheritDoc}
|
Chris@0
|
217 */
|
Chris@0
|
218 public function filter(Closure $p)
|
Chris@0
|
219 {
|
Chris@0
|
220 $this->initialize();
|
Chris@0
|
221 return $this->collection->filter($p);
|
Chris@0
|
222 }
|
Chris@0
|
223
|
Chris@0
|
224 /**
|
Chris@0
|
225 * {@inheritDoc}
|
Chris@0
|
226 */
|
Chris@0
|
227 public function forAll(Closure $p)
|
Chris@0
|
228 {
|
Chris@0
|
229 $this->initialize();
|
Chris@0
|
230 return $this->collection->forAll($p);
|
Chris@0
|
231 }
|
Chris@0
|
232
|
Chris@0
|
233 /**
|
Chris@0
|
234 * {@inheritDoc}
|
Chris@0
|
235 */
|
Chris@0
|
236 public function map(Closure $func)
|
Chris@0
|
237 {
|
Chris@0
|
238 $this->initialize();
|
Chris@0
|
239 return $this->collection->map($func);
|
Chris@0
|
240 }
|
Chris@0
|
241
|
Chris@0
|
242 /**
|
Chris@0
|
243 * {@inheritDoc}
|
Chris@0
|
244 */
|
Chris@0
|
245 public function partition(Closure $p)
|
Chris@0
|
246 {
|
Chris@0
|
247 $this->initialize();
|
Chris@0
|
248 return $this->collection->partition($p);
|
Chris@0
|
249 }
|
Chris@0
|
250
|
Chris@0
|
251 /**
|
Chris@0
|
252 * {@inheritDoc}
|
Chris@0
|
253 */
|
Chris@0
|
254 public function indexOf($element)
|
Chris@0
|
255 {
|
Chris@0
|
256 $this->initialize();
|
Chris@0
|
257 return $this->collection->indexOf($element);
|
Chris@0
|
258 }
|
Chris@0
|
259
|
Chris@0
|
260 /**
|
Chris@0
|
261 * {@inheritDoc}
|
Chris@0
|
262 */
|
Chris@0
|
263 public function slice($offset, $length = null)
|
Chris@0
|
264 {
|
Chris@0
|
265 $this->initialize();
|
Chris@0
|
266 return $this->collection->slice($offset, $length);
|
Chris@0
|
267 }
|
Chris@0
|
268
|
Chris@0
|
269 /**
|
Chris@0
|
270 * {@inheritDoc}
|
Chris@0
|
271 */
|
Chris@0
|
272 public function getIterator()
|
Chris@0
|
273 {
|
Chris@0
|
274 $this->initialize();
|
Chris@0
|
275 return $this->collection->getIterator();
|
Chris@0
|
276 }
|
Chris@0
|
277
|
Chris@0
|
278 /**
|
Chris@0
|
279 * {@inheritDoc}
|
Chris@0
|
280 */
|
Chris@0
|
281 public function offsetExists($offset)
|
Chris@0
|
282 {
|
Chris@0
|
283 $this->initialize();
|
Chris@0
|
284 return $this->collection->offsetExists($offset);
|
Chris@0
|
285 }
|
Chris@0
|
286
|
Chris@0
|
287 /**
|
Chris@0
|
288 * {@inheritDoc}
|
Chris@0
|
289 */
|
Chris@0
|
290 public function offsetGet($offset)
|
Chris@0
|
291 {
|
Chris@0
|
292 $this->initialize();
|
Chris@0
|
293 return $this->collection->offsetGet($offset);
|
Chris@0
|
294 }
|
Chris@0
|
295
|
Chris@0
|
296 /**
|
Chris@0
|
297 * {@inheritDoc}
|
Chris@0
|
298 */
|
Chris@0
|
299 public function offsetSet($offset, $value)
|
Chris@0
|
300 {
|
Chris@0
|
301 $this->initialize();
|
Chris@0
|
302 $this->collection->offsetSet($offset, $value);
|
Chris@0
|
303 }
|
Chris@0
|
304
|
Chris@0
|
305 /**
|
Chris@0
|
306 * {@inheritDoc}
|
Chris@0
|
307 */
|
Chris@0
|
308 public function offsetUnset($offset)
|
Chris@0
|
309 {
|
Chris@0
|
310 $this->initialize();
|
Chris@0
|
311 $this->collection->offsetUnset($offset);
|
Chris@0
|
312 }
|
Chris@0
|
313
|
Chris@0
|
314 /**
|
Chris@0
|
315 * Is the lazy collection already initialized?
|
Chris@0
|
316 *
|
Chris@0
|
317 * @return bool
|
Chris@0
|
318 */
|
Chris@0
|
319 public function isInitialized()
|
Chris@0
|
320 {
|
Chris@0
|
321 return $this->initialized;
|
Chris@0
|
322 }
|
Chris@0
|
323
|
Chris@0
|
324 /**
|
Chris@0
|
325 * Initialize the collection
|
Chris@0
|
326 *
|
Chris@0
|
327 * @return void
|
Chris@0
|
328 */
|
Chris@0
|
329 protected function initialize()
|
Chris@0
|
330 {
|
Chris@0
|
331 if ( ! $this->initialized) {
|
Chris@0
|
332 $this->doInitialize();
|
Chris@0
|
333 $this->initialized = true;
|
Chris@0
|
334 }
|
Chris@0
|
335 }
|
Chris@0
|
336
|
Chris@0
|
337 /**
|
Chris@0
|
338 * Do the initialization logic
|
Chris@0
|
339 *
|
Chris@0
|
340 * @return void
|
Chris@0
|
341 */
|
Chris@0
|
342 abstract protected function doInitialize();
|
Chris@0
|
343 }
|