Completed
Push — master ( 54e09a...250b3d )
by James
11s
created
src/Core/Container.php 1 patch
Indentation   +318 added lines, -318 removed lines patch added patch discarded remove patch
@@ -13,322 +13,322 @@
 block discarded – undo
13 13
  * @subpackage Core
14 14
  */
15 15
 class Container implements ContainerContract {
16
-	/**
17
-	 * ServiceProvider names to register with the container.
18
-	 *
19
-	 * Can be overwritten to include predefined providers.
20
-	 *
21
-	 * @var string[]
22
-	 */
23
-	protected $providers = array();
24
-
25
-	/**
26
-	 * Registered definitions.
27
-	 *
28
-	 * @var mixed[]
29
-	 */
30
-	private $definitions = array();
31
-
32
-	/**
33
-	 * Aliases to share between fetches.
34
-	 *
35
-	 * @var <string, true>[]
36
-	 */
37
-	private $shared = array();
38
-
39
-	/**
40
-	 * Aliases of all the registered services.
41
-	 *
42
-	 * @var <string, true>[]
43
-	 */
44
-	private $aliases = array();
45
-
46
-	/**
47
-	 * Array of classes registered on the container.
48
-	 *
49
-	 * @var <string, true>[]
50
-	 */
51
-	private $classes = array();
52
-
53
-	/**
54
-	 * Current position in the loop.
55
-	 *
56
-	 * @var int
57
-	 */
58
-	private $position;
59
-
60
-	/**
61
-	 * 0-indexed array of aliases for looping.
62
-	 *
63
-	 * @var string[]
64
-	 */
65
-	private $keys = array();
66
-
67
-	/**
68
-	 * Create a new container with the given providers.
69
-	 *
70
-	 * Providers can be instances or the class of the provider as a string.
71
-	 *
72
-	 * @param ServiceProvider[]|string[] $providers
73
-	 */
74
-	public function __construct( array $providers = array() ) {
75
-		// array_unique ensures we only register each provider once.
76
-		$providers = array_unique( array_merge( $this->providers, $providers ) );
77
-
78
-		foreach ( $providers as $provider ) {
79
-			if ( is_string( $provider ) && class_exists( $provider ) ) {
80
-				$provider = new $provider;
81
-			}
82
-
83
-			if ( $provider instanceof ServiceProvider ) {
84
-				$this->register( $provider );
85
-			}
86
-		}
87
-	}
88
-
89
-
90
-	/**
91
-	 * {@inheritdoc}
92
-	 *
93
-	 * @param string|array $alias
94
-	 * @param mixed        $definition
95
-	 *
96
-	 * @throws DefinedAliasException
97
-	 *
98
-	 * @return $this
99
-	 */
100
-	public function define( $alias, $definition ) {
101
-		if ( is_array( $alias ) ) {
102
-			$class = current( $alias );
103
-			$alias = key( $alias );
104
-		}
105
-
106
-		if ( isset( $this->aliases[ $alias ] ) ) {
107
-			throw new DefinedAliasException( $alias );
108
-		}
109
-
110
-		$this->aliases[ $alias ]     = true;
111
-		$this->definitions[ $alias ] = $definition;
112
-
113
-		// Closures are treated as factories unless
114
-		// defined via Container::share.
115
-		if ( ! $definition instanceof \Closure ) {
116
-			$this->shared[ $alias ] = true;
117
-		}
118
-
119
-		if ( isset( $class ) ) {
120
-			$this->classes[ $class ] = $alias;
121
-		}
122
-
123
-		return $this;
124
-	}
125
-
126
-	/**
127
-	 * {@inheritdoc}
128
-	 *
129
-	 * @param string|array $alias
130
-	 * @param mixed        $definition
131
-	 *
132
-	 * @throws DefinedAliasException
133
-	 *
134
-	 * @return $this
135
-	 */
136
-	public function share( $alias, $definition ) {
137
-		$this->define( $alias, $definition );
138
-
139
-		if ( is_array( $alias ) ) {
140
-			$alias = key( $alias );
141
-		}
142
-
143
-		$this->shared[ $alias ] = true;
144
-
145
-		return $this;
146
-	}
147
-
148
-	/**
149
-	 * {@inheritdoc}
150
-	 *
151
-	 * @param string $alias
152
-	 *
153
-	 * @throws UndefinedAliasException
154
-	 *
155
-	 * @return mixed
156
-	 */
157
-	public function fetch( $alias ) {
158
-		if ( isset( $this->classes[ $alias ] ) ) {
159
-			// If the alias is a class name,
160
-			// then retrieve its linked alias.
161
-			// This is only registered when
162
-			// registering using an array.
163
-			$alias = $this->classes[ $alias ];
164
-		}
165
-
166
-		if ( ! isset( $this->aliases[ $alias ] ) ) {
167
-			throw new UndefinedAliasException( $alias );
168
-		}
169
-
170
-		$value = $this->definitions[ $alias ];
171
-
172
-		// If the shared value is a closure,
173
-		// execute it and assign the result
174
-		// in place of the closure.
175
-		if ( $value instanceof \Closure ) {
176
-			$factory = $value;
177
-			$value   = $factory( $this );
178
-		}
179
-
180
-		// If the value is shared, save the shared value.
181
-		if ( isset( $this->shared[ $alias ] ) ) {
182
-			$this->definitions[ $alias ] = $value;
183
-		}
184
-
185
-		// Return the fetched value.
186
-		return $value;
187
-	}
188
-
189
-	/**
190
-	 * {@inheritdoc}
191
-	 *
192
-	 * @param  string $alias
193
-	 *
194
-	 * @return bool
195
-	 */
196
-	public function has( $alias ) {
197
-		return isset( $this->aliases[ $alias ] );
198
-	}
199
-
200
-	/**
201
-	 * {@inheritDoc}
202
-	 *
203
-	 * @param string $alias
204
-	 *
205
-	 * @return $this
206
-	 */
207
-	public function remove( $alias ) {
208
-		if ( isset( $this->aliases[ $alias ] ) ) {
209
-			/**
210
-			 * If there's no reference in the aliases array,
211
-			 * the service won't be found on fetching and
212
-			 * can be overwritten on setting.
213
-			 *
214
-			 * Pros: Quick setting/unsetting, faster
215
-			 * performance on those operations when doing
216
-			 * a lot of these.
217
-			 *
218
-			 * Cons: Objects and values set in the container
219
-			 * can't get garbage collected.
220
-			 *
221
-			 * If this is a problem, this may need to be revisited.
222
-			 */
223
-			unset( $this->aliases[ $alias ] );
224
-		}
225
-
226
-		return $this;
227
-	}
228
-
229
-	/**
230
-	 * {@inheritDoc}
231
-	 *
232
-	 * @param ServiceProvider $provider
233
-	 *
234
-	 * @return $this
235
-	 */
236
-	public function register( ServiceProvider $provider ) {
237
-		// @todo make sure provider is only registered once
238
-		$provider->register( $this );
239
-
240
-		return $this;
241
-	}
242
-
243
-	/**
244
-	 * Set a value into the container.
245
-	 *
246
-	 * @param  string $id
247
-	 * @param  mixed  $value
248
-	 *
249
-	 * @see    define
250
-	 */
251
-	public function offsetSet( $id, $value ) {
252
-		$this->define( $id, $value );
253
-	}
254
-
255
-	/**
256
-	 * Get an value from the container.
257
-	 *
258
-	 * @param  string $id
259
-	 *
260
-	 * @return object
261
-	 * @throws UndefinedAliasException
262
-	 *
263
-	 * @see    fetch
264
-	 */
265
-	public function offsetGet( $id ) {
266
-		return $this->fetch( $id );
267
-	}
268
-
269
-	/**
270
-	 * Checks if a key is set on the container.
271
-	 *
272
-	 * @param  string $id
273
-	 *
274
-	 * @return bool
275
-	 *
276
-	 * @see    has
277
-	 */
278
-	public function offsetExists( $id ) {
279
-		return $this->has( $id );
280
-	}
281
-
282
-	/**
283
-	 * Remove a key from the container.
284
-	 *
285
-	 * @param string $id
286
-	 *
287
-	 * @see   remove
288
-	 */
289
-	public function offsetUnset( $id ) {
290
-		$this->remove( $id );
291
-	}
292
-
293
-	/**
294
-	 * Sets the object properties to prepare for the loop.
295
-	 */
296
-	public function rewind() {
297
-		$this->position = 0;
298
-		$this->keys     = array_keys( $this->aliases );
299
-	}
300
-
301
-	/**
302
-	 * Retrieves the service object for the current step in the loop.
303
-	 *
304
-	 * @return object
305
-	 */
306
-	public function current() {
307
-		return $this->fetch( $this->keys[ $this->position ] );
308
-	}
309
-
310
-	/**
311
-	 * Retrieves the key for the current step in the loop.
312
-	 *
313
-	 * @return string
314
-	 */
315
-	public function key() {
316
-		return $this->keys[ $this->position ];
317
-	}
318
-
319
-	/**
320
-	 * Increments to the next step in the loop.
321
-	 */
322
-	public function next() {
323
-		$this->position ++;
324
-	}
325
-
326
-	/**
327
-	 * Checks if the next step in the loop in valid.
328
-	 *
329
-	 * @return bool
330
-	 */
331
-	public function valid() {
332
-		return isset( $this->keys[ $this->position ] );
333
-	}
16
+    /**
17
+     * ServiceProvider names to register with the container.
18
+     *
19
+     * Can be overwritten to include predefined providers.
20
+     *
21
+     * @var string[]
22
+     */
23
+    protected $providers = array();
24
+
25
+    /**
26
+     * Registered definitions.
27
+     *
28
+     * @var mixed[]
29
+     */
30
+    private $definitions = array();
31
+
32
+    /**
33
+     * Aliases to share between fetches.
34
+     *
35
+     * @var <string, true>[]
36
+     */
37
+    private $shared = array();
38
+
39
+    /**
40
+     * Aliases of all the registered services.
41
+     *
42
+     * @var <string, true>[]
43
+     */
44
+    private $aliases = array();
45
+
46
+    /**
47
+     * Array of classes registered on the container.
48
+     *
49
+     * @var <string, true>[]
50
+     */
51
+    private $classes = array();
52
+
53
+    /**
54
+     * Current position in the loop.
55
+     *
56
+     * @var int
57
+     */
58
+    private $position;
59
+
60
+    /**
61
+     * 0-indexed array of aliases for looping.
62
+     *
63
+     * @var string[]
64
+     */
65
+    private $keys = array();
66
+
67
+    /**
68
+     * Create a new container with the given providers.
69
+     *
70
+     * Providers can be instances or the class of the provider as a string.
71
+     *
72
+     * @param ServiceProvider[]|string[] $providers
73
+     */
74
+    public function __construct( array $providers = array() ) {
75
+        // array_unique ensures we only register each provider once.
76
+        $providers = array_unique( array_merge( $this->providers, $providers ) );
77
+
78
+        foreach ( $providers as $provider ) {
79
+            if ( is_string( $provider ) && class_exists( $provider ) ) {
80
+                $provider = new $provider;
81
+            }
82
+
83
+            if ( $provider instanceof ServiceProvider ) {
84
+                $this->register( $provider );
85
+            }
86
+        }
87
+    }
88
+
89
+
90
+    /**
91
+     * {@inheritdoc}
92
+     *
93
+     * @param string|array $alias
94
+     * @param mixed        $definition
95
+     *
96
+     * @throws DefinedAliasException
97
+     *
98
+     * @return $this
99
+     */
100
+    public function define( $alias, $definition ) {
101
+        if ( is_array( $alias ) ) {
102
+            $class = current( $alias );
103
+            $alias = key( $alias );
104
+        }
105
+
106
+        if ( isset( $this->aliases[ $alias ] ) ) {
107
+            throw new DefinedAliasException( $alias );
108
+        }
109
+
110
+        $this->aliases[ $alias ]     = true;
111
+        $this->definitions[ $alias ] = $definition;
112
+
113
+        // Closures are treated as factories unless
114
+        // defined via Container::share.
115
+        if ( ! $definition instanceof \Closure ) {
116
+            $this->shared[ $alias ] = true;
117
+        }
118
+
119
+        if ( isset( $class ) ) {
120
+            $this->classes[ $class ] = $alias;
121
+        }
122
+
123
+        return $this;
124
+    }
125
+
126
+    /**
127
+     * {@inheritdoc}
128
+     *
129
+     * @param string|array $alias
130
+     * @param mixed        $definition
131
+     *
132
+     * @throws DefinedAliasException
133
+     *
134
+     * @return $this
135
+     */
136
+    public function share( $alias, $definition ) {
137
+        $this->define( $alias, $definition );
138
+
139
+        if ( is_array( $alias ) ) {
140
+            $alias = key( $alias );
141
+        }
142
+
143
+        $this->shared[ $alias ] = true;
144
+
145
+        return $this;
146
+    }
147
+
148
+    /**
149
+     * {@inheritdoc}
150
+     *
151
+     * @param string $alias
152
+     *
153
+     * @throws UndefinedAliasException
154
+     *
155
+     * @return mixed
156
+     */
157
+    public function fetch( $alias ) {
158
+        if ( isset( $this->classes[ $alias ] ) ) {
159
+            // If the alias is a class name,
160
+            // then retrieve its linked alias.
161
+            // This is only registered when
162
+            // registering using an array.
163
+            $alias = $this->classes[ $alias ];
164
+        }
165
+
166
+        if ( ! isset( $this->aliases[ $alias ] ) ) {
167
+            throw new UndefinedAliasException( $alias );
168
+        }
169
+
170
+        $value = $this->definitions[ $alias ];
171
+
172
+        // If the shared value is a closure,
173
+        // execute it and assign the result
174
+        // in place of the closure.
175
+        if ( $value instanceof \Closure ) {
176
+            $factory = $value;
177
+            $value   = $factory( $this );
178
+        }
179
+
180
+        // If the value is shared, save the shared value.
181
+        if ( isset( $this->shared[ $alias ] ) ) {
182
+            $this->definitions[ $alias ] = $value;
183
+        }
184
+
185
+        // Return the fetched value.
186
+        return $value;
187
+    }
188
+
189
+    /**
190
+     * {@inheritdoc}
191
+     *
192
+     * @param  string $alias
193
+     *
194
+     * @return bool
195
+     */
196
+    public function has( $alias ) {
197
+        return isset( $this->aliases[ $alias ] );
198
+    }
199
+
200
+    /**
201
+     * {@inheritDoc}
202
+     *
203
+     * @param string $alias
204
+     *
205
+     * @return $this
206
+     */
207
+    public function remove( $alias ) {
208
+        if ( isset( $this->aliases[ $alias ] ) ) {
209
+            /**
210
+             * If there's no reference in the aliases array,
211
+             * the service won't be found on fetching and
212
+             * can be overwritten on setting.
213
+             *
214
+             * Pros: Quick setting/unsetting, faster
215
+             * performance on those operations when doing
216
+             * a lot of these.
217
+             *
218
+             * Cons: Objects and values set in the container
219
+             * can't get garbage collected.
220
+             *
221
+             * If this is a problem, this may need to be revisited.
222
+             */
223
+            unset( $this->aliases[ $alias ] );
224
+        }
225
+
226
+        return $this;
227
+    }
228
+
229
+    /**
230
+     * {@inheritDoc}
231
+     *
232
+     * @param ServiceProvider $provider
233
+     *
234
+     * @return $this
235
+     */
236
+    public function register( ServiceProvider $provider ) {
237
+        // @todo make sure provider is only registered once
238
+        $provider->register( $this );
239
+
240
+        return $this;
241
+    }
242
+
243
+    /**
244
+     * Set a value into the container.
245
+     *
246
+     * @param  string $id
247
+     * @param  mixed  $value
248
+     *
249
+     * @see    define
250
+     */
251
+    public function offsetSet( $id, $value ) {
252
+        $this->define( $id, $value );
253
+    }
254
+
255
+    /**
256
+     * Get an value from the container.
257
+     *
258
+     * @param  string $id
259
+     *
260
+     * @return object
261
+     * @throws UndefinedAliasException
262
+     *
263
+     * @see    fetch
264
+     */
265
+    public function offsetGet( $id ) {
266
+        return $this->fetch( $id );
267
+    }
268
+
269
+    /**
270
+     * Checks if a key is set on the container.
271
+     *
272
+     * @param  string $id
273
+     *
274
+     * @return bool
275
+     *
276
+     * @see    has
277
+     */
278
+    public function offsetExists( $id ) {
279
+        return $this->has( $id );
280
+    }
281
+
282
+    /**
283
+     * Remove a key from the container.
284
+     *
285
+     * @param string $id
286
+     *
287
+     * @see   remove
288
+     */
289
+    public function offsetUnset( $id ) {
290
+        $this->remove( $id );
291
+    }
292
+
293
+    /**
294
+     * Sets the object properties to prepare for the loop.
295
+     */
296
+    public function rewind() {
297
+        $this->position = 0;
298
+        $this->keys     = array_keys( $this->aliases );
299
+    }
300
+
301
+    /**
302
+     * Retrieves the service object for the current step in the loop.
303
+     *
304
+     * @return object
305
+     */
306
+    public function current() {
307
+        return $this->fetch( $this->keys[ $this->position ] );
308
+    }
309
+
310
+    /**
311
+     * Retrieves the key for the current step in the loop.
312
+     *
313
+     * @return string
314
+     */
315
+    public function key() {
316
+        return $this->keys[ $this->position ];
317
+    }
318
+
319
+    /**
320
+     * Increments to the next step in the loop.
321
+     */
322
+    public function next() {
323
+        $this->position ++;
324
+    }
325
+
326
+    /**
327
+     * Checks if the next step in the loop in valid.
328
+     *
329
+     * @return bool
330
+     */
331
+    public function valid() {
332
+        return isset( $this->keys[ $this->position ] );
333
+    }
334 334
 }
Please login to merge, or discard this patch.
src/Utility/Str.php 1 patch
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -11,39 +11,39 @@
 block discarded – undo
11 11
  * @subpackage Utility
12 12
  */
13 13
 class Str {
14
-	/**
15
-	 * Determine if a given string starts with a given substring.
16
-	 *
17
-	 * @param  string       $haystack
18
-	 * @param  string|array $needles
19
-	 *
20
-	 * @return bool
21
-	 */
22
-	public static function starts_with( $haystack, $needles ) {
23
-		foreach ( (array) $needles as $needle ) {
24
-			if ( '' !== $needle && 0 === strpos( $haystack, $needle ) ) {
25
-				return true;
26
-			}
27
-		}
14
+    /**
15
+     * Determine if a given string starts with a given substring.
16
+     *
17
+     * @param  string       $haystack
18
+     * @param  string|array $needles
19
+     *
20
+     * @return bool
21
+     */
22
+    public static function starts_with( $haystack, $needles ) {
23
+        foreach ( (array) $needles as $needle ) {
24
+            if ( '' !== $needle && 0 === strpos( $haystack, $needle ) ) {
25
+                return true;
26
+            }
27
+        }
28 28
 
29
-		return false;
30
-	}
29
+        return false;
30
+    }
31 31
 
32
-	/**
33
-	 * Determine if a given string ends with a given substring.
34
-	 *
35
-	 * @param  string       $haystack
36
-	 * @param  string|array $needles
37
-	 *
38
-	 * @return bool
39
-	 */
40
-	public static function ends_with( $haystack, $needles ) {
41
-		foreach ( (array) $needles as $needle ) {
42
-			if ( substr( $haystack, - strlen( $needle ) ) === (string) $needle ) {
43
-				return true;
44
-			}
45
-		}
32
+    /**
33
+     * Determine if a given string ends with a given substring.
34
+     *
35
+     * @param  string       $haystack
36
+     * @param  string|array $needles
37
+     *
38
+     * @return bool
39
+     */
40
+    public static function ends_with( $haystack, $needles ) {
41
+        foreach ( (array) $needles as $needle ) {
42
+            if ( substr( $haystack, - strlen( $needle ) ) === (string) $needle ) {
43
+                return true;
44
+            }
45
+        }
46 46
 
47
-		return false;
48
-	}
47
+        return false;
48
+    }
49 49
 }
Please login to merge, or discard this patch.
src/Contract/Core/I18n.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -2,10 +2,10 @@
 block discarded – undo
2 2
 namespace Intraxia\Jaxion\Contract\Core;
3 3
 
4 4
 interface I18n {
5
-	/**
6
-	 * Loads the plugin's textdomain.
7
-	 *
8
-	 * @return void
9
-	 */
10
-	public function load_plugin_textdomain();
5
+    /**
6
+     * Loads the plugin's textdomain.
7
+     *
8
+     * @return void
9
+     */
10
+    public function load_plugin_textdomain();
11 11
 }
Please login to merge, or discard this patch.
src/Core/I18n.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -11,53 +11,53 @@
 block discarded – undo
11 11
  * @subpackage Core
12 12
  */
13 13
 class I18n implements I18nContract, HasActions {
14
-	/**
15
-	 * Plugin basename
16
-	 *
17
-	 * @var string
18
-	 */
19
-	private $basename;
14
+    /**
15
+     * Plugin basename
16
+     *
17
+     * @var string
18
+     */
19
+    private $basename;
20 20
 
21
-	/**
22
-	 * Plugin path.
23
-	 *
24
-	 * @var string
25
-	 */
26
-	private $path;
21
+    /**
22
+     * Plugin path.
23
+     *
24
+     * @var string
25
+     */
26
+    private $path;
27 27
 
28
-	/**
29
-	 * I18n constructor.
30
-	 *
31
-	 * @param string $basename Plugin basename.
32
-	 * @param string $path     Plugin path.
33
-	 */
34
-	public function __construct( $basename, $path ) {
35
-		$this->basename = $basename;
36
-		$this->path = $path;
37
-	}
28
+    /**
29
+     * I18n constructor.
30
+     *
31
+     * @param string $basename Plugin basename.
32
+     * @param string $path     Plugin path.
33
+     */
34
+    public function __construct( $basename, $path ) {
35
+        $this->basename = $basename;
36
+        $this->path = $path;
37
+    }
38 38
 
39
-	/**
40
-	 * {@inheritdoc}
41
-	 */
42
-	public function load_plugin_textdomain() {
43
-		load_plugin_textdomain(
44
-			$this->basename,
45
-			false,
46
-			basename( $this->path ) . '/languages/'
47
-		);
48
-	}
39
+    /**
40
+     * {@inheritdoc}
41
+     */
42
+    public function load_plugin_textdomain() {
43
+        load_plugin_textdomain(
44
+            $this->basename,
45
+            false,
46
+            basename( $this->path ) . '/languages/'
47
+        );
48
+    }
49 49
 
50
-	/**
51
-	 * {@inheritDoc}
52
-	 *
53
-	 * @return array
54
-	 */
55
-	public function action_hooks() {
56
-		return array(
57
-			array(
58
-				'hook'   => 'init',
59
-				'method' => 'load_plugin_textdomain',
60
-			),
61
-		);
62
-	}
50
+    /**
51
+     * {@inheritDoc}
52
+     *
53
+     * @return array
54
+     */
55
+    public function action_hooks() {
56
+        return array(
57
+            array(
58
+                'hook'   => 'init',
59
+                'method' => 'load_plugin_textdomain',
60
+            ),
61
+        );
62
+    }
63 63
 }
Please login to merge, or discard this patch.
src/Core/Application.php 1 patch
Indentation   +133 added lines, -133 removed lines patch added patch discarded remove patch
@@ -13,137 +13,137 @@
 block discarded – undo
13 13
  * @package Intraxia\Jaxion
14 14
  */
15 15
 class Application extends Container implements ApplicationContract {
16
-	/**
17
-	 * Define plugin version on Application.
18
-	 */
19
-	const VERSION = '';
20
-
21
-	/**
22
-	 * Singleton instance of the Application object
23
-	 *
24
-	 * @var Application[]
25
-	 */
26
-	protected static $instances = array();
27
-
28
-	/**
29
-	 * Instantiates a new Application container.
30
-	 *
31
-	 * The Application constructor enforces the presence of of a single instance
32
-	 * of the Application. If an instance already exists, an Exception will be thrown.
33
-	 *
34
-	 * @param string $file
35
-	 * @param array  $providers
36
-	 *
37
-	 * @throws ApplicationAlreadyBootedException
38
-	 */
39
-	public function __construct( $file, array $providers = array() ) {
40
-		if ( isset( static::$instances[ get_called_class() ] ) ) {
41
-			throw new ApplicationAlreadyBootedException;
42
-		}
43
-
44
-		static::$instances[ get_called_class() ] = $this;
45
-
46
-		$this->register_constants( $file );
47
-		$this->register_core_services();
48
-
49
-		register_activation_hook( $file, array( $this, 'activate' ) );
50
-		register_deactivation_hook( $file, array( $this, 'deactivate' ) );
51
-
52
-		parent::__construct( $providers );
53
-	}
54
-
55
-	/**
56
-	 * {@inheritDoc}
57
-	 *
58
-	 * @throws UnexpectedValueException
59
-	 */
60
-	public function boot() {
61
-		$loader = $this->fetch( 'loader' );
62
-
63
-		if ( ! $loader instanceof LoaderContract ) {
64
-			throw new UnexpectedValueException;
65
-		}
66
-
67
-		foreach ( $this as $alias => $value ) {
68
-			if ( $value instanceof HasActions ) {
69
-				$loader->register_actions( $value );
70
-			}
71
-
72
-			if ( $value instanceof HasFilters ) {
73
-				$loader->register_filters( $value );
74
-			}
75
-
76
-			if ( $value instanceof HasShortcode ) {
77
-				$loader->register_shortcode( $value );
78
-			}
79
-		}
80
-
81
-		add_action( 'plugins_loaded', array( $loader, 'run' ) );
82
-	}
83
-
84
-	/**
85
-	 * {@inheritdoc}
86
-	 *
87
-	 * @codeCoverageIgnore
88
-	 */
89
-	public function activate() {
90
-		// no-op
91
-	}
92
-
93
-	/**
94
-	 * {@inheritdoc}
95
-	 *
96
-	 * @codeCoverageIgnore
97
-	 */
98
-	public function deactivate() {
99
-		// no-op
100
-	}
101
-
102
-	/**
103
-	 * {@inheritDoc}
104
-	 *
105
-	 * @return Application
106
-	 * @throws ApplicationNotBootedException
107
-	 */
108
-	public static function instance() {
109
-		if ( ! isset( static::$instances[ get_called_class() ] ) ) {
110
-			throw new ApplicationNotBootedException;
111
-		}
112
-
113
-		return static::$instances[ get_called_class() ];
114
-	}
115
-
116
-	/**
117
-	 * {@inheritDoc}
118
-	 */
119
-	public static function shutdown() {
120
-		if ( isset( static::$instances[ get_called_class() ] ) ) {
121
-			unset( static::$instances[ get_called_class() ] );
122
-		}
123
-	}
124
-
125
-	/**
126
-	 * Sets the plugin's url, path, and basename.
127
-	 *
128
-	 * @param string $file
129
-	 */
130
-	private function register_constants( $file ) {
131
-		$this->share( 'url', plugin_dir_url( $file ) );
132
-		$this->share( 'path', plugin_dir_path( $file ) );
133
-		$this->share( 'basename', $basename = plugin_basename( $file ) );
134
-		$this->share( 'slug', dirname( $basename ) );
135
-		$this->share( 'version', static::VERSION );
136
-	}
137
-
138
-	/**
139
-	 * Registers the built-in services with the Application container.
140
-	 */
141
-	private function register_core_services() {
142
-		$this->share( array( 'loader' => 'Intraxia\Jaxion\Contract\Core\Loader' ), function ( $app ) {
143
-			return new Loader( $app );
144
-		} );
145
-		$this->share( array( 'i18n' => 'Intaxia\Jaxion\Contract\Core\I18n' ), function ( $app ) {
146
-			return new I18n( $app->fetch( 'basename' ), $app->fetch( 'path' ) );
147
-		} );
148
-	}
16
+    /**
17
+     * Define plugin version on Application.
18
+     */
19
+    const VERSION = '';
20
+
21
+    /**
22
+     * Singleton instance of the Application object
23
+     *
24
+     * @var Application[]
25
+     */
26
+    protected static $instances = array();
27
+
28
+    /**
29
+     * Instantiates a new Application container.
30
+     *
31
+     * The Application constructor enforces the presence of of a single instance
32
+     * of the Application. If an instance already exists, an Exception will be thrown.
33
+     *
34
+     * @param string $file
35
+     * @param array  $providers
36
+     *
37
+     * @throws ApplicationAlreadyBootedException
38
+     */
39
+    public function __construct( $file, array $providers = array() ) {
40
+        if ( isset( static::$instances[ get_called_class() ] ) ) {
41
+            throw new ApplicationAlreadyBootedException;
42
+        }
43
+
44
+        static::$instances[ get_called_class() ] = $this;
45
+
46
+        $this->register_constants( $file );
47
+        $this->register_core_services();
48
+
49
+        register_activation_hook( $file, array( $this, 'activate' ) );
50
+        register_deactivation_hook( $file, array( $this, 'deactivate' ) );
51
+
52
+        parent::__construct( $providers );
53
+    }
54
+
55
+    /**
56
+     * {@inheritDoc}
57
+     *
58
+     * @throws UnexpectedValueException
59
+     */
60
+    public function boot() {
61
+        $loader = $this->fetch( 'loader' );
62
+
63
+        if ( ! $loader instanceof LoaderContract ) {
64
+            throw new UnexpectedValueException;
65
+        }
66
+
67
+        foreach ( $this as $alias => $value ) {
68
+            if ( $value instanceof HasActions ) {
69
+                $loader->register_actions( $value );
70
+            }
71
+
72
+            if ( $value instanceof HasFilters ) {
73
+                $loader->register_filters( $value );
74
+            }
75
+
76
+            if ( $value instanceof HasShortcode ) {
77
+                $loader->register_shortcode( $value );
78
+            }
79
+        }
80
+
81
+        add_action( 'plugins_loaded', array( $loader, 'run' ) );
82
+    }
83
+
84
+    /**
85
+     * {@inheritdoc}
86
+     *
87
+     * @codeCoverageIgnore
88
+     */
89
+    public function activate() {
90
+        // no-op
91
+    }
92
+
93
+    /**
94
+     * {@inheritdoc}
95
+     *
96
+     * @codeCoverageIgnore
97
+     */
98
+    public function deactivate() {
99
+        // no-op
100
+    }
101
+
102
+    /**
103
+     * {@inheritDoc}
104
+     *
105
+     * @return Application
106
+     * @throws ApplicationNotBootedException
107
+     */
108
+    public static function instance() {
109
+        if ( ! isset( static::$instances[ get_called_class() ] ) ) {
110
+            throw new ApplicationNotBootedException;
111
+        }
112
+
113
+        return static::$instances[ get_called_class() ];
114
+    }
115
+
116
+    /**
117
+     * {@inheritDoc}
118
+     */
119
+    public static function shutdown() {
120
+        if ( isset( static::$instances[ get_called_class() ] ) ) {
121
+            unset( static::$instances[ get_called_class() ] );
122
+        }
123
+    }
124
+
125
+    /**
126
+     * Sets the plugin's url, path, and basename.
127
+     *
128
+     * @param string $file
129
+     */
130
+    private function register_constants( $file ) {
131
+        $this->share( 'url', plugin_dir_url( $file ) );
132
+        $this->share( 'path', plugin_dir_path( $file ) );
133
+        $this->share( 'basename', $basename = plugin_basename( $file ) );
134
+        $this->share( 'slug', dirname( $basename ) );
135
+        $this->share( 'version', static::VERSION );
136
+    }
137
+
138
+    /**
139
+     * Registers the built-in services with the Application container.
140
+     */
141
+    private function register_core_services() {
142
+        $this->share( array( 'loader' => 'Intraxia\Jaxion\Contract\Core\Loader' ), function ( $app ) {
143
+            return new Loader( $app );
144
+        } );
145
+        $this->share( array( 'i18n' => 'Intaxia\Jaxion\Contract\Core\I18n' ), function ( $app ) {
146
+            return new I18n( $app->fetch( 'basename' ), $app->fetch( 'path' ) );
147
+        } );
148
+    }
149 149
 }
Please login to merge, or discard this patch.
src/Assets/Register.php 1 patch
Indentation   +204 added lines, -204 removed lines patch added patch discarded remove patch
@@ -12,208 +12,208 @@
 block discarded – undo
12 12
  * @subpackage Register
13 13
  */
14 14
 class Register implements RegisterContract {
15
-	/**
16
-	 * Minification string for enqueued assets.
17
-	 *
18
-	 * @var string
19
-	 */
20
-	private $min = '';
21
-
22
-	/**
23
-	 * Url to the plugin directory.
24
-	 *
25
-	 * @var string
26
-	 */
27
-	protected $url;
28
-
29
-	/**
30
-	 * Script/plugin version.
31
-	 *
32
-	 * @var string
33
-	 */
34
-	protected $version;
35
-
36
-	/**
37
-	 * Array of script definition arrays.
38
-	 *
39
-	 * @var array
40
-	 */
41
-	private $scripts = array();
42
-
43
-	/**
44
-	 * Array of style definition arrays.
45
-	 *
46
-	 * @var array
47
-	 */
48
-	private $styles = array();
49
-
50
-	/**
51
-	 * Instantiates a new instance of the Register class.
52
-	 *
53
-	 * The URL param should be relative to the plugin directory. The URL
54
-	 * form should always end with a '/'. All asset location definitions
55
-	 * should not begin with a slash and should be relative to the plugin's
56
-	 * root directory. The URL provided by default from the Application
57
-	 * class is compatible.
58
-	 *
59
-	 * @param string $url
60
-	 * @param string $version
61
-	 */
62
-	public function __construct( $url, $version = null ) {
63
-		$this->url     = $url;
64
-		$this->version = $version ?: null; // Empty string should remain null.
65
-	}
66
-
67
-	/**
68
-	 * {@inheritdoc}
69
-	 *
70
-	 * @param bool $debug
71
-	 */
72
-	public function set_debug( $debug ) {
73
-		if ( $debug ) {
74
-			$this->min = '.min';
75
-		} else {
76
-			$this->min = '';
77
-		}
78
-	}
79
-
80
-	/**
81
-	 * {@inheritdoc}
82
-	 *
83
-	 * @param array $script
84
-	 */
85
-	public function register_script( $script ) {
86
-		$this->scripts[] = $script;
87
-	}
88
-
89
-	/**
90
-	 * {@inheritdoc}
91
-	 *
92
-	 * @param array $style
93
-	 */
94
-	public function register_style( $style ) {
95
-		$this->styles[] = $style;
96
-	}
97
-
98
-	/**
99
-	 * {@inheritDoc}
100
-	 */
101
-	public function enqueue_web_scripts() {
102
-		foreach ( $this->scripts as $script ) {
103
-			if ( in_array( $script['type'], array( 'web', 'shared' ) ) ) {
104
-				$this->enqueue_script( $script );
105
-			}
106
-		}
107
-	}
108
-
109
-	/**
110
-	 * {@inheritDoc}
111
-	 */
112
-	public function enqueue_web_styles() {
113
-		foreach ( $this->styles as $style ) {
114
-			if ( in_array( $style['type'], array( 'web', 'shared' ) ) ) {
115
-				$this->enqueue_style( $style );
116
-			}
117
-		}
118
-	}
119
-
120
-	/**
121
-	 * {@inheritDoc}
122
-	 *
123
-	 * @param string $hook Passes a string representing the current page.
124
-	 */
125
-	public function enqueue_admin_scripts( $hook ) {
126
-		foreach ( $this->scripts as $script ) {
127
-			if ( in_array( $script['type'], array( 'admin', 'shared' ) ) ) {
128
-				$this->enqueue_script( $script, $hook );
129
-			}
130
-		}
131
-	}
132
-
133
-	/**
134
-	 * {@inheritDoc}
135
-	 *
136
-	 * @param string $hook Passes a string representing the current page.
137
-	 */
138
-	public function enqueue_admin_styles( $hook ) {
139
-		foreach ( $this->styles as $style ) {
140
-			if ( in_array( $style['type'], array( 'admin', 'shared' ) ) ) {
141
-				$this->enqueue_style( $style, $hook );
142
-			}
143
-		}
144
-	}
145
-
146
-	/**
147
-	 * {@inheritDoc}
148
-	 *
149
-	 * @return array[]
150
-	 */
151
-	public function action_hooks() {
152
-		return array(
153
-			array(
154
-				'hook'   => 'wp_enqueue_scripts',
155
-				'method' => 'enqueue_web_scripts',
156
-			),
157
-			array(
158
-				'hook'   => 'wp_enqueue_scripts',
159
-				'method' => 'enqueue_web_styles',
160
-			),
161
-			array(
162
-				'hook'   => 'admin_enqueue_scripts',
163
-				'method' => 'enqueue_admin_scripts',
164
-			),
165
-			array(
166
-				'hook'   => 'admin_enqueue_scripts',
167
-				'method' => 'enqueue_admin_styles',
168
-			),
169
-		);
170
-	}
171
-
172
-	/**
173
-	 * Enqueues an individual script if the style's condition is met.
174
-	 *
175
-	 * @param array  $script The script attachment callback.
176
-	 * @param string $hook   The location hook. Only passed on admin side.
177
-	 */
178
-	protected function enqueue_script( $script, $hook = null ) {
179
-		if ( $script['condition']( $hook ) ) {
180
-			wp_enqueue_script(
181
-				$script['handle'],
182
-				$this->url . $script['src'] . '.js',
183
-				isset( $script['deps'] ) ? $script['deps'] : array(),
184
-				$this->version,
185
-				isset( $script['footer'] ) ? $script['footer'] : false
186
-			);
187
-
188
-			if ( isset( $script['localize'] ) ) {
189
-				if ( is_callable( $script['localize'] ) ) { // @todo make all properties callables
190
-					$script['localize'] = call_user_func( $script['localize'] );
191
-				}
192
-
193
-				wp_localize_script(
194
-					$script['handle'],
195
-					$script['localize']['name'],
196
-					$script['localize']['data']
197
-				);
198
-			}
199
-		}
200
-	}
201
-
202
-	/**
203
-	 * Enqueues an individual stylesheet if the style's condition is met.
204
-	 *
205
-	 * @param array  $style The style attachment callback.
206
-	 * @param string $hook  The location hook.
207
-	 */
208
-	protected function enqueue_style( $style, $hook = null ) {
209
-		if ( $style['condition']( $hook ) ) {
210
-			wp_enqueue_style(
211
-				$style['handle'],
212
-				$this->url . $style['src'] . '.css',
213
-				isset( $style['deps'] ) ? $style['deps'] : array(),
214
-				$this->version,
215
-				isset( $style['media'] ) ? $style['media'] : 'all'
216
-			);
217
-		}
218
-	}
15
+    /**
16
+     * Minification string for enqueued assets.
17
+     *
18
+     * @var string
19
+     */
20
+    private $min = '';
21
+
22
+    /**
23
+     * Url to the plugin directory.
24
+     *
25
+     * @var string
26
+     */
27
+    protected $url;
28
+
29
+    /**
30
+     * Script/plugin version.
31
+     *
32
+     * @var string
33
+     */
34
+    protected $version;
35
+
36
+    /**
37
+     * Array of script definition arrays.
38
+     *
39
+     * @var array
40
+     */
41
+    private $scripts = array();
42
+
43
+    /**
44
+     * Array of style definition arrays.
45
+     *
46
+     * @var array
47
+     */
48
+    private $styles = array();
49
+
50
+    /**
51
+     * Instantiates a new instance of the Register class.
52
+     *
53
+     * The URL param should be relative to the plugin directory. The URL
54
+     * form should always end with a '/'. All asset location definitions
55
+     * should not begin with a slash and should be relative to the plugin's
56
+     * root directory. The URL provided by default from the Application
57
+     * class is compatible.
58
+     *
59
+     * @param string $url
60
+     * @param string $version
61
+     */
62
+    public function __construct( $url, $version = null ) {
63
+        $this->url     = $url;
64
+        $this->version = $version ?: null; // Empty string should remain null.
65
+    }
66
+
67
+    /**
68
+     * {@inheritdoc}
69
+     *
70
+     * @param bool $debug
71
+     */
72
+    public function set_debug( $debug ) {
73
+        if ( $debug ) {
74
+            $this->min = '.min';
75
+        } else {
76
+            $this->min = '';
77
+        }
78
+    }
79
+
80
+    /**
81
+     * {@inheritdoc}
82
+     *
83
+     * @param array $script
84
+     */
85
+    public function register_script( $script ) {
86
+        $this->scripts[] = $script;
87
+    }
88
+
89
+    /**
90
+     * {@inheritdoc}
91
+     *
92
+     * @param array $style
93
+     */
94
+    public function register_style( $style ) {
95
+        $this->styles[] = $style;
96
+    }
97
+
98
+    /**
99
+     * {@inheritDoc}
100
+     */
101
+    public function enqueue_web_scripts() {
102
+        foreach ( $this->scripts as $script ) {
103
+            if ( in_array( $script['type'], array( 'web', 'shared' ) ) ) {
104
+                $this->enqueue_script( $script );
105
+            }
106
+        }
107
+    }
108
+
109
+    /**
110
+     * {@inheritDoc}
111
+     */
112
+    public function enqueue_web_styles() {
113
+        foreach ( $this->styles as $style ) {
114
+            if ( in_array( $style['type'], array( 'web', 'shared' ) ) ) {
115
+                $this->enqueue_style( $style );
116
+            }
117
+        }
118
+    }
119
+
120
+    /**
121
+     * {@inheritDoc}
122
+     *
123
+     * @param string $hook Passes a string representing the current page.
124
+     */
125
+    public function enqueue_admin_scripts( $hook ) {
126
+        foreach ( $this->scripts as $script ) {
127
+            if ( in_array( $script['type'], array( 'admin', 'shared' ) ) ) {
128
+                $this->enqueue_script( $script, $hook );
129
+            }
130
+        }
131
+    }
132
+
133
+    /**
134
+     * {@inheritDoc}
135
+     *
136
+     * @param string $hook Passes a string representing the current page.
137
+     */
138
+    public function enqueue_admin_styles( $hook ) {
139
+        foreach ( $this->styles as $style ) {
140
+            if ( in_array( $style['type'], array( 'admin', 'shared' ) ) ) {
141
+                $this->enqueue_style( $style, $hook );
142
+            }
143
+        }
144
+    }
145
+
146
+    /**
147
+     * {@inheritDoc}
148
+     *
149
+     * @return array[]
150
+     */
151
+    public function action_hooks() {
152
+        return array(
153
+            array(
154
+                'hook'   => 'wp_enqueue_scripts',
155
+                'method' => 'enqueue_web_scripts',
156
+            ),
157
+            array(
158
+                'hook'   => 'wp_enqueue_scripts',
159
+                'method' => 'enqueue_web_styles',
160
+            ),
161
+            array(
162
+                'hook'   => 'admin_enqueue_scripts',
163
+                'method' => 'enqueue_admin_scripts',
164
+            ),
165
+            array(
166
+                'hook'   => 'admin_enqueue_scripts',
167
+                'method' => 'enqueue_admin_styles',
168
+            ),
169
+        );
170
+    }
171
+
172
+    /**
173
+     * Enqueues an individual script if the style's condition is met.
174
+     *
175
+     * @param array  $script The script attachment callback.
176
+     * @param string $hook   The location hook. Only passed on admin side.
177
+     */
178
+    protected function enqueue_script( $script, $hook = null ) {
179
+        if ( $script['condition']( $hook ) ) {
180
+            wp_enqueue_script(
181
+                $script['handle'],
182
+                $this->url . $script['src'] . '.js',
183
+                isset( $script['deps'] ) ? $script['deps'] : array(),
184
+                $this->version,
185
+                isset( $script['footer'] ) ? $script['footer'] : false
186
+            );
187
+
188
+            if ( isset( $script['localize'] ) ) {
189
+                if ( is_callable( $script['localize'] ) ) { // @todo make all properties callables
190
+                    $script['localize'] = call_user_func( $script['localize'] );
191
+                }
192
+
193
+                wp_localize_script(
194
+                    $script['handle'],
195
+                    $script['localize']['name'],
196
+                    $script['localize']['data']
197
+                );
198
+            }
199
+        }
200
+    }
201
+
202
+    /**
203
+     * Enqueues an individual stylesheet if the style's condition is met.
204
+     *
205
+     * @param array  $style The style attachment callback.
206
+     * @param string $hook  The location hook.
207
+     */
208
+    protected function enqueue_style( $style, $hook = null ) {
209
+        if ( $style['condition']( $hook ) ) {
210
+            wp_enqueue_style(
211
+                $style['handle'],
212
+                $this->url . $style['src'] . '.css',
213
+                isset( $style['deps'] ) ? $style['deps'] : array(),
214
+                $this->version,
215
+                isset( $style['media'] ) ? $style['media'] : 'all'
216
+            );
217
+        }
218
+    }
219 219
 }
Please login to merge, or discard this patch.
src/Contract/Assets/Register.php 1 patch
Indentation   +48 added lines, -48 removed lines patch added patch discarded remove patch
@@ -4,52 +4,52 @@
 block discarded – undo
4 4
 use Intraxia\Jaxion\Contract\Core\HasActions;
5 5
 
6 6
 interface Register extends HasActions {
7
-	/**
8
-	 * Enable debug mode for the enqueued assets.
9
-	 *
10
-	 * Debug mode will enqueue unminified versions of the registered assets.
11
-	 * Primarily, this is intended to be used along with WordPress's `SCRIPT_DEBUG`
12
-	 * constant, which enables unminified core assets to be enqueued.
13
-	 *
14
-	 * @param bool $debug
15
-	 */
16
-	public function set_debug( $debug );
17
-
18
-	/**
19
-	 * Provides a method to register new scripts outside of the constructor.
20
-	 *
21
-	 * @param array $script
22
-	 */
23
-	public function register_script( $script );
24
-
25
-	/**
26
-	 * Provides a method to register new styles outside of the constructor.
27
-	 *
28
-	 * @param array $style
29
-	 */
30
-	public function register_style( $style );
31
-
32
-	/**
33
-	 * Enqueues the web & shared scripts on the Register.
34
-	 */
35
-	public function enqueue_web_scripts();
36
-
37
-	/**
38
-	 * Enqueues the web & shared styles on the Register.
39
-	 */
40
-	public function enqueue_web_styles();
41
-
42
-	/**
43
-	 * Enqueues the admin & shared scripts on the Register.
44
-	 *
45
-	 * @param string $hook Passes a string representing the current page.
46
-	 */
47
-	public function enqueue_admin_scripts( $hook );
48
-
49
-	/**
50
-	 * Enqueues the admin & shared styles on the Register.
51
-	 *
52
-	 * @param string $hook Passes a string representing the current page.
53
-	 */
54
-	public function enqueue_admin_styles( $hook );
7
+    /**
8
+     * Enable debug mode for the enqueued assets.
9
+     *
10
+     * Debug mode will enqueue unminified versions of the registered assets.
11
+     * Primarily, this is intended to be used along with WordPress's `SCRIPT_DEBUG`
12
+     * constant, which enables unminified core assets to be enqueued.
13
+     *
14
+     * @param bool $debug
15
+     */
16
+    public function set_debug( $debug );
17
+
18
+    /**
19
+     * Provides a method to register new scripts outside of the constructor.
20
+     *
21
+     * @param array $script
22
+     */
23
+    public function register_script( $script );
24
+
25
+    /**
26
+     * Provides a method to register new styles outside of the constructor.
27
+     *
28
+     * @param array $style
29
+     */
30
+    public function register_style( $style );
31
+
32
+    /**
33
+     * Enqueues the web & shared scripts on the Register.
34
+     */
35
+    public function enqueue_web_scripts();
36
+
37
+    /**
38
+     * Enqueues the web & shared styles on the Register.
39
+     */
40
+    public function enqueue_web_styles();
41
+
42
+    /**
43
+     * Enqueues the admin & shared scripts on the Register.
44
+     *
45
+     * @param string $hook Passes a string representing the current page.
46
+     */
47
+    public function enqueue_admin_scripts( $hook );
48
+
49
+    /**
50
+     * Enqueues the admin & shared styles on the Register.
51
+     *
52
+     * @param string $hook Passes a string representing the current page.
53
+     */
54
+    public function enqueue_admin_styles( $hook );
55 55
 }
Please login to merge, or discard this patch.
src/Contract/Axolotl/Collection.php 1 patch
Indentation   +314 added lines, -314 removed lines patch added patch discarded remove patch
@@ -9,318 +9,318 @@
 block discarded – undo
9 9
 
10 10
 interface Collection extends Iterator, Countable, Serializes {
11 11
 
12
-	/**
13
-	 * Returns the type of the collection.
14
-	 *
15
-	 * @return string
16
-	 */
17
-	public function get_type();
18
-
19
-	/**
20
-	 * Returns a collection with $element added.
21
-	 *
22
-	 * @param  mixed $element
23
-	 * @return Collection
24
-	 * @throws InvalidArgumentException
25
-	 */
26
-	public function add( $element );
27
-
28
-	/**
29
-	 * Removes every element from the collection.
30
-	 *
31
-	 * @return Collection
32
-	 */
33
-	public function clear();
34
-
35
-	/**
36
-	 * Returns true if the collection contains any elements that satisfy
37
-	 * $condition, returns false if it contains none.
38
-	 *
39
-	 * @param callable $condition
40
-	 * @return bool
41
-	 */
42
-	public function contains( $condition );
43
-
44
-	/**
45
-	 * Returns the first element in the collection that satisfies
46
-	 * $condition, returns false if no such element exists.
47
-	 *
48
-	 * @param callable $condition
49
-	 * @return mixed
50
-	 */
51
-	public function find( $condition );
52
-
53
-	/**
54
-	 * Returns the index of the first element in the collection that satisfies
55
-	 * $condition, returns -1 if no such element exists.
56
-	 *
57
-	 * @param callable $condition
58
-	 * @return int
59
-	 */
60
-	public function find_index( $condition );
61
-
62
-	/**
63
-	 * Returns the element in the collection at $index.
64
-	 *
65
-	 * @param  int $index Index to get element from.
66
-	 * @return mixed
67
-	 * @throws OutOfRangeException
68
-	 */
69
-	public function at( $index );
70
-
71
-	/**
72
-	 * Returns true if $index is within the collection's range and returns false
73
-	 * if it is not.
74
-	 *
75
-	 * @param  int $index Index to check for existence.
76
-	 * @return bool
77
-	 * @throws InvalidArgumentException
78
-	 */
79
-	public function index_exists( $index );
80
-
81
-	/**
82
-	 * Returns the number of elements in the collection.
83
-	 *
84
-	 * @return int
85
-	 */
86
-	public function count();
87
-
88
-	/**
89
-	 * Returns a collection that only contains the elements which satisfy
90
-	 * $condition.
91
-	 *
92
-	 * @param callable $condition
93
-	 * @return Collection
94
-	 */
95
-	public function filter( $condition );
96
-
97
-	/**
98
-	 * Returns the last element in the collection that satisfies $condition,
99
-	 * returns false if no such element exists.
100
-	 *
101
-	 * @param callable $condition
102
-	 * @return mixed
103
-	 */
104
-	public function find_last( $condition );
105
-
106
-	/**
107
-	 * Returns the index of the last element in the collection that satisfies
108
-	 * $condition, returns -1 if no such element exists.
109
-	 *
110
-	 * @param callable $condition
111
-	 * @return int
112
-	 */
113
-	public function find_last_index( $condition );
114
-
115
-	/**
116
-	 * Returns a collection that contains the subset of elements ranging from the
117
-	 * index $start to $end.
118
-	 *
119
-	 * @param  int $start Begining index to slice from.
120
-	 * @param  int $end   End index to slice to.
121
-	 * @return Collection
122
-	 * @throws InvalidArgumentException
123
-	 */
124
-	public function slice( $start, $end );
125
-
126
-	/**
127
-	 * Inserts $element at $index.
128
-	 *
129
-	 * @param int   $index     Index to start at.
130
-	 * @param mixed $element Element to insert.
131
-	 * @return Collection
132
-	 * @throws InvalidArgumentException
133
-	 * @throws OutOfRangeException
134
-	 */
135
-	public function insert( $index, $element );
136
-
137
-	/**
138
-	 * Inserts the range $elements at $index.
139
-	 *
140
-	 * @param int   $index
141
-	 * @param array $elements
142
-	 * @return Collection
143
-	 * @throws OutOfRangeException
144
-	 */
145
-	public function insert_range( $index, array $elements );
146
-
147
-	/**
148
-	 * Removes all of the elements that satisfy $condition.
149
-	 *
150
-	 * @param  callable $condition
151
-	 * @return Collection
152
-	 */
153
-	public function reject( $condition );
154
-
155
-	/**
156
-	 * Removes the element at $index.
157
-	 *
158
-	 * @param  int $index Index to remove.
159
-	 * @return Collection
160
-	 * @throws OutOfRangeException
161
-	 */
162
-	public function remove_at( $index );
163
-
164
-	/**
165
-	 * Reverses the order of the elements in the collection.
166
-	 *
167
-	 * @return Collection
168
-	 */
169
-	public function reverse();
170
-
171
-	/**
172
-	 * Sorts the elements in the collection using the user supplied comparison
173
-	 * function $callback.
174
-	 *
175
-	 * @param callable $callback
176
-	 * @return Collection
177
-	 */
178
-	public function sort( $callback );
179
-
180
-	/**
181
-	 * Returns an array containing the elements in the collection.
182
-	 *
183
-	 * @return array
184
-	 */
185
-	public function to_array();
186
-
187
-	/**
188
-	 * Iteratively reduces the collection to a single value using the callback
189
-	 * function $callable.
190
-	 *
191
-	 * @param callable $callable
192
-	 * @param null     $initial
193
-	 * @return mixed
194
-	 */
195
-	public function reduce( $callable, $initial = null );
196
-
197
-	/**
198
-	 * Returns true if every element in the collection satisfies $condition,
199
-	 * returns false if not.
200
-	 *
201
-	 * @param callable $condition
202
-	 * @return bool
203
-	 */
204
-	public function every( $condition );
205
-
206
-	/**
207
-	 * Removes all of the elements in the collection starting at index $num.
208
-	 *
209
-	 * @param  int $num Number of elements to drop.
210
-	 * @return Collection
211
-	 * @throws InvalidArgumentException
212
-	 */
213
-	public function drop( $num );
214
-
215
-	/**
216
-	 * Removes all of the elements in the collectioin between index 0 and $num.
217
-	 *
218
-	 * @param int $num Number of elements to drop.
219
-	 * @return Collection
220
-	 * @throws InvalidArgumentException
221
-	 */
222
-	public function drop_right( $num );
223
-
224
-	/**
225
-	 * Iteratively drops elements in the collection that satisfy $condition until
226
-	 * an element is encountered that does not satisfy $condition.
227
-	 *
228
-	 * @param callable $condition
229
-	 * @return Collection
230
-	 */
231
-	public function drop_while( $condition );
232
-
233
-	/**
234
-	 * Removes the first element in the collection.
235
-	 *
236
-	 * @return Collection
237
-	 * @throws InvalidArgumentException
238
-	 */
239
-	public function tail();
240
-
241
-	/**
242
-	 * Removes all of the elements in the collection starting at index $num.
243
-	 *
244
-	 * @param  int $num Number of elements to take.
245
-	 * @return Collection
246
-	 * @throws InvalidArgumentException
247
-	 */
248
-	public function take( $num );
249
-
250
-	/**
251
-	 * Removes all of the elements in the collection before index $num.
252
-	 *
253
-	 * @param int $num Number of elements to take.
254
-	 * @return Collection
255
-	 * @throws InvalidArgumentException
256
-	 */
257
-	public function take_right( $num );
258
-
259
-	/**
260
-	 * Iterates through the collection until an element is encountered that does
261
-	 * not satisfy $condition, then drops all of the elements starting at that
262
-	 * index.
263
-	 *
264
-	 * @param callable $condition
265
-	 * @return Collection
266
-	 */
267
-	public function take_while( $condition );
268
-
269
-	/**
270
-	 * Applies the callback function $callable to each element in the collection.
271
-	 *
272
-	 * @param callable $callable
273
-	 */
274
-	public function each( $callable );
275
-
276
-	/**
277
-	 * Returns a new instance of the collection with the callback function
278
-	 * $callable applied to each element.
279
-	 *
280
-	 * @param callable $callable
281
-	 * @return Collection
282
-	 */
283
-	public function map( $callable );
284
-
285
-	/**
286
-	 * Iteratively reduces the collection to a single value using the callback
287
-	 * function $callable starting at the rightmost index.
288
-	 *
289
-	 * @param callable $callable
290
-	 * @param null     $initial
291
-	 * @return mixed
292
-	 */
293
-	public function reduce_right( $callable, $initial = null );
294
-
295
-	/**
296
-	 * Randomly reorders the elements in the collection.
297
-	 *
298
-	 * @return Collection
299
-	 */
300
-	public function shuffle();
301
-
302
-	/**
303
-	 * Adds every member of $elements to the collection.
304
-	 *
305
-	 * @param array|Collection $elements Array of elements to merge.
306
-	 * @return Collection
307
-	 * @throws InvalidArgumentException
308
-	 */
309
-	public function merge( $elements );
310
-
311
-	/**
312
-	 * Get first element of the collection
313
-	 *
314
-	 * @return mixed
315
-	 * @throws OutOfBoundsException
316
-	 */
317
-	public function first();
318
-
319
-	/**
320
-	 * Get last element of the collection
321
-	 *
322
-	 * @return mixed
323
-	 * @throws OutOfBoundsException
324
-	 */
325
-	public function last();
12
+    /**
13
+     * Returns the type of the collection.
14
+     *
15
+     * @return string
16
+     */
17
+    public function get_type();
18
+
19
+    /**
20
+     * Returns a collection with $element added.
21
+     *
22
+     * @param  mixed $element
23
+     * @return Collection
24
+     * @throws InvalidArgumentException
25
+     */
26
+    public function add( $element );
27
+
28
+    /**
29
+     * Removes every element from the collection.
30
+     *
31
+     * @return Collection
32
+     */
33
+    public function clear();
34
+
35
+    /**
36
+     * Returns true if the collection contains any elements that satisfy
37
+     * $condition, returns false if it contains none.
38
+     *
39
+     * @param callable $condition
40
+     * @return bool
41
+     */
42
+    public function contains( $condition );
43
+
44
+    /**
45
+     * Returns the first element in the collection that satisfies
46
+     * $condition, returns false if no such element exists.
47
+     *
48
+     * @param callable $condition
49
+     * @return mixed
50
+     */
51
+    public function find( $condition );
52
+
53
+    /**
54
+     * Returns the index of the first element in the collection that satisfies
55
+     * $condition, returns -1 if no such element exists.
56
+     *
57
+     * @param callable $condition
58
+     * @return int
59
+     */
60
+    public function find_index( $condition );
61
+
62
+    /**
63
+     * Returns the element in the collection at $index.
64
+     *
65
+     * @param  int $index Index to get element from.
66
+     * @return mixed
67
+     * @throws OutOfRangeException
68
+     */
69
+    public function at( $index );
70
+
71
+    /**
72
+     * Returns true if $index is within the collection's range and returns false
73
+     * if it is not.
74
+     *
75
+     * @param  int $index Index to check for existence.
76
+     * @return bool
77
+     * @throws InvalidArgumentException
78
+     */
79
+    public function index_exists( $index );
80
+
81
+    /**
82
+     * Returns the number of elements in the collection.
83
+     *
84
+     * @return int
85
+     */
86
+    public function count();
87
+
88
+    /**
89
+     * Returns a collection that only contains the elements which satisfy
90
+     * $condition.
91
+     *
92
+     * @param callable $condition
93
+     * @return Collection
94
+     */
95
+    public function filter( $condition );
96
+
97
+    /**
98
+     * Returns the last element in the collection that satisfies $condition,
99
+     * returns false if no such element exists.
100
+     *
101
+     * @param callable $condition
102
+     * @return mixed
103
+     */
104
+    public function find_last( $condition );
105
+
106
+    /**
107
+     * Returns the index of the last element in the collection that satisfies
108
+     * $condition, returns -1 if no such element exists.
109
+     *
110
+     * @param callable $condition
111
+     * @return int
112
+     */
113
+    public function find_last_index( $condition );
114
+
115
+    /**
116
+     * Returns a collection that contains the subset of elements ranging from the
117
+     * index $start to $end.
118
+     *
119
+     * @param  int $start Begining index to slice from.
120
+     * @param  int $end   End index to slice to.
121
+     * @return Collection
122
+     * @throws InvalidArgumentException
123
+     */
124
+    public function slice( $start, $end );
125
+
126
+    /**
127
+     * Inserts $element at $index.
128
+     *
129
+     * @param int   $index     Index to start at.
130
+     * @param mixed $element Element to insert.
131
+     * @return Collection
132
+     * @throws InvalidArgumentException
133
+     * @throws OutOfRangeException
134
+     */
135
+    public function insert( $index, $element );
136
+
137
+    /**
138
+     * Inserts the range $elements at $index.
139
+     *
140
+     * @param int   $index
141
+     * @param array $elements
142
+     * @return Collection
143
+     * @throws OutOfRangeException
144
+     */
145
+    public function insert_range( $index, array $elements );
146
+
147
+    /**
148
+     * Removes all of the elements that satisfy $condition.
149
+     *
150
+     * @param  callable $condition
151
+     * @return Collection
152
+     */
153
+    public function reject( $condition );
154
+
155
+    /**
156
+     * Removes the element at $index.
157
+     *
158
+     * @param  int $index Index to remove.
159
+     * @return Collection
160
+     * @throws OutOfRangeException
161
+     */
162
+    public function remove_at( $index );
163
+
164
+    /**
165
+     * Reverses the order of the elements in the collection.
166
+     *
167
+     * @return Collection
168
+     */
169
+    public function reverse();
170
+
171
+    /**
172
+     * Sorts the elements in the collection using the user supplied comparison
173
+     * function $callback.
174
+     *
175
+     * @param callable $callback
176
+     * @return Collection
177
+     */
178
+    public function sort( $callback );
179
+
180
+    /**
181
+     * Returns an array containing the elements in the collection.
182
+     *
183
+     * @return array
184
+     */
185
+    public function to_array();
186
+
187
+    /**
188
+     * Iteratively reduces the collection to a single value using the callback
189
+     * function $callable.
190
+     *
191
+     * @param callable $callable
192
+     * @param null     $initial
193
+     * @return mixed
194
+     */
195
+    public function reduce( $callable, $initial = null );
196
+
197
+    /**
198
+     * Returns true if every element in the collection satisfies $condition,
199
+     * returns false if not.
200
+     *
201
+     * @param callable $condition
202
+     * @return bool
203
+     */
204
+    public function every( $condition );
205
+
206
+    /**
207
+     * Removes all of the elements in the collection starting at index $num.
208
+     *
209
+     * @param  int $num Number of elements to drop.
210
+     * @return Collection
211
+     * @throws InvalidArgumentException
212
+     */
213
+    public function drop( $num );
214
+
215
+    /**
216
+     * Removes all of the elements in the collectioin between index 0 and $num.
217
+     *
218
+     * @param int $num Number of elements to drop.
219
+     * @return Collection
220
+     * @throws InvalidArgumentException
221
+     */
222
+    public function drop_right( $num );
223
+
224
+    /**
225
+     * Iteratively drops elements in the collection that satisfy $condition until
226
+     * an element is encountered that does not satisfy $condition.
227
+     *
228
+     * @param callable $condition
229
+     * @return Collection
230
+     */
231
+    public function drop_while( $condition );
232
+
233
+    /**
234
+     * Removes the first element in the collection.
235
+     *
236
+     * @return Collection
237
+     * @throws InvalidArgumentException
238
+     */
239
+    public function tail();
240
+
241
+    /**
242
+     * Removes all of the elements in the collection starting at index $num.
243
+     *
244
+     * @param  int $num Number of elements to take.
245
+     * @return Collection
246
+     * @throws InvalidArgumentException
247
+     */
248
+    public function take( $num );
249
+
250
+    /**
251
+     * Removes all of the elements in the collection before index $num.
252
+     *
253
+     * @param int $num Number of elements to take.
254
+     * @return Collection
255
+     * @throws InvalidArgumentException
256
+     */
257
+    public function take_right( $num );
258
+
259
+    /**
260
+     * Iterates through the collection until an element is encountered that does
261
+     * not satisfy $condition, then drops all of the elements starting at that
262
+     * index.
263
+     *
264
+     * @param callable $condition
265
+     * @return Collection
266
+     */
267
+    public function take_while( $condition );
268
+
269
+    /**
270
+     * Applies the callback function $callable to each element in the collection.
271
+     *
272
+     * @param callable $callable
273
+     */
274
+    public function each( $callable );
275
+
276
+    /**
277
+     * Returns a new instance of the collection with the callback function
278
+     * $callable applied to each element.
279
+     *
280
+     * @param callable $callable
281
+     * @return Collection
282
+     */
283
+    public function map( $callable );
284
+
285
+    /**
286
+     * Iteratively reduces the collection to a single value using the callback
287
+     * function $callable starting at the rightmost index.
288
+     *
289
+     * @param callable $callable
290
+     * @param null     $initial
291
+     * @return mixed
292
+     */
293
+    public function reduce_right( $callable, $initial = null );
294
+
295
+    /**
296
+     * Randomly reorders the elements in the collection.
297
+     *
298
+     * @return Collection
299
+     */
300
+    public function shuffle();
301
+
302
+    /**
303
+     * Adds every member of $elements to the collection.
304
+     *
305
+     * @param array|Collection $elements Array of elements to merge.
306
+     * @return Collection
307
+     * @throws InvalidArgumentException
308
+     */
309
+    public function merge( $elements );
310
+
311
+    /**
312
+     * Get first element of the collection
313
+     *
314
+     * @return mixed
315
+     * @throws OutOfBoundsException
316
+     */
317
+    public function first();
318
+
319
+    /**
320
+     * Get last element of the collection
321
+     *
322
+     * @return mixed
323
+     * @throws OutOfBoundsException
324
+     */
325
+    public function last();
326 326
 }
Please login to merge, or discard this patch.
src/Axolotl/Collection.php 1 patch
Indentation   +741 added lines, -741 removed lines patch added patch discarded remove patch
@@ -15,745 +15,745 @@
 block discarded – undo
15 15
  */
16 16
 class Collection implements CollectionContract {
17 17
 
18
-	/**
19
-	 * Collection elements.
20
-	 *
21
-	 * @var array
22
-	 */
23
-	protected $elements = array();
24
-
25
-	/**
26
-	 * Collection type to enforce.
27
-	 *
28
-	 * @var Type
29
-	 */
30
-	private $type;
31
-
32
-	/**
33
-	 * Where Collection is in loop.
34
-	 *
35
-	 * @var int
36
-	 */
37
-	protected $position = 0;
38
-
39
-	/**
40
-	 * Collection constructor.
41
-	 *
42
-	 * @param string $type
43
-	 * @param array  $elements
44
-	 */
45
-	public function __construct( $type, array $elements = array() ) {
46
-		$this->type = new Type( $type );
47
-
48
-		if ( $this->type->is_model() ) {
49
-			foreach ( $elements as $idx => $element ) {
50
-				if ( is_array( $element ) ) {
51
-					$elements[ $idx ] = $this->type->create_model( $element );
52
-				}
53
-			}
54
-		}
55
-
56
-		if ( $elements ) {
57
-			$this->type->validate_elements( $elements );
58
-		}
59
-
60
-		$this->elements = $elements;
61
-	}
62
-
63
-	/**
64
-	 * {@inheritdoc}
65
-	 *
66
-	 * @return string
67
-	 */
68
-	public function get_type() {
69
-		return $this->type->get_type();
70
-	}
71
-
72
-	/**
73
-	 * {@inheritdoc}
74
-	 *
75
-	 * @param mixed $element
76
-	 *
77
-	 * @return Collection
78
-	 *
79
-	 * @throws InvalidArgumentException
80
-	 */
81
-	public function add( $element ) {
82
-		if ( $this->type->is_model() && is_array( $element ) ) {
83
-			$element = $this->type->create_model( $element );
84
-		}
85
-
86
-		$this->type->validate_element( $element );
87
-
88
-		$elements   = $this->elements;
89
-		$elements[] = $element;
90
-
91
-		$collection = new static( $this->get_type() );
92
-		$collection->set_from_trusted( $elements );
93
-
94
-		return $collection;
95
-	}
96
-
97
-	/**
98
-	 * {@inheritdoc}
99
-	 *
100
-	 * @return Collection
101
-	 */
102
-	public function clear() {
103
-		return new static( $this->get_type() );
104
-	}
105
-
106
-	/**
107
-	 * {@inheritdoc}
108
-	 *
109
-	 * @param  callable $condition Condition to satisfy.
110
-	 *
111
-	 * @return bool
112
-	 */
113
-	public function contains( $condition ) {
114
-		return (bool) $this->find( $condition );
115
-	}
116
-
117
-	/**
118
-	 * {@inheritdoc}
119
-	 *
120
-	 * @param  callable $condition Condition to satisfy.
121
-	 *
122
-	 * @return mixed
123
-	 */
124
-	public function find( $condition ) {
125
-		$index = $this->find_index( $condition );
126
-
127
-		return -1 === $index ? null : $this->elements[ $index ];
128
-	}
129
-
130
-	/**
131
-	 * {@inheritdoc}
132
-	 *
133
-	 * @param  callable $condition Condition to satisfy.
134
-	 *
135
-	 * @return int
136
-	 */
137
-	public function find_index( $condition ) {
138
-		$index = -1;
139
-
140
-		for ( $i = 0, $count = count( $this->elements ); $i < $count; $i++ ) {
141
-			if ( call_user_func( $condition, ($this->at( $i ) ) ) ) {
142
-				$index = $i;
143
-				break;
144
-			}
145
-		}
146
-
147
-		return $index;
148
-	}
149
-
150
-	/**
151
-	 * Fetches the element at the provided index.
152
-	 *
153
-	 * @param int $index Index to get element from.
154
-	 *
155
-	 * @return mixed
156
-	 *
157
-	 * @throws OutOfRangeException
158
-	 */
159
-	public function at( $index ) {
160
-		$this->validate_index( $index );
161
-
162
-		return $this->elements[ $index ];
163
-	}
164
-
165
-	/**
166
-	 * {@inheritdoc}
167
-	 *
168
-	 * @param  int $index Index to check for existence.
169
-	 *
170
-	 * @return bool
171
-	 *
172
-	 * @throws InvalidArgumentException
173
-	 */
174
-	public function index_exists( $index ) {
175
-		if ( ! is_int( $index ) ) {
176
-			throw new InvalidArgumentException( 'Index must be an integer' );
177
-		}
178
-
179
-		if ( $index < 0 ) {
180
-			throw new InvalidArgumentException( 'Index must be a non-negative integer' );
181
-		}
182
-
183
-		return $index < $this->count();
184
-	}
185
-
186
-	/**
187
-	 * {@inheritdoc}
188
-	 *
189
-	 * @param  callable $condition Condition to satisfy.
190
-	 *
191
-	 * @return mixed
192
-	 */
193
-	public function filter( $condition ) {
194
-		$elements = array();
195
-
196
-		foreach ( $this->elements as $element ) {
197
-			if ( call_user_func( $condition, $element ) ) {
198
-				$elements[] = $element;
199
-			}
200
-		}
201
-
202
-		return $this->new_from_trusted( $elements );
203
-	}
204
-	/**
205
-	 * {@inheritdoc}
206
-	 *
207
-	 * @param  callable $condition Condition to satisfy.
208
-	 *
209
-	 * @return mixed
210
-	 */
211
-	public function find_last( $condition ) {
212
-		$index = $this->find_last_index( $condition );
213
-
214
-		return -1 === $index ? null : $this->elements[ $index ];
215
-	}
216
-
217
-	/**
218
-	 * {@inheritdoc}
219
-	 *
220
-	 * @param  callable $condition
221
-	 * @return int
222
-	 */
223
-	public function find_last_index( $condition ) {
224
-		$index = -1;
225
-
226
-		for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
227
-			if ( call_user_func( $condition, $this->elements[ $i ] ) ) {
228
-				$index = $i;
229
-				break;
230
-			}
231
-		}
232
-
233
-		return $index;
234
-	}
235
-
236
-	/**
237
-	 * {@inheritdoc}
238
-	 *
239
-	 * @param  int $start Begining index to slice from.
240
-	 * @param  int $end   End index to slice to.
241
-	 *
242
-	 * @return Collection
243
-	 *
244
-	 * @throws InvalidArgumentException
245
-	 */
246
-	public function slice( $start, $end ) {
247
-		if ( $start < 0 || ! is_int( $start ) ) {
248
-			throw new InvalidArgumentException( 'Start must be a non-negative integer' );
249
-		}
250
-
251
-		if ( $end < 0 || ! is_int( $end ) ) {
252
-			throw new InvalidArgumentException( 'End must be a positive integer' );
253
-		}
254
-
255
-		if ( $start > $end ) {
256
-			throw new InvalidArgumentException( 'End must be greater than start' );
257
-		}
258
-
259
-		if ( $end > $this->count() + 1 ) {
260
-			throw new InvalidArgumentException( 'End must be less than the count of the items in the Collection' );
261
-		}
262
-
263
-		$length = $end - $start + 1;
264
-
265
-		return $this->new_from_trusted( array_slice( $this->elements, $start, $length ) );
266
-	}
267
-
268
-	/**
269
-	 * {@inheritdoc}
270
-	 *
271
-	 * @param int   $index     Index to start at.
272
-	 * @param mixed $element Element to insert.
273
-	 *
274
-	 * @return Collection
275
-	 *
276
-	 * @throws InvalidArgumentException
277
-	 * @throws OutOfRangeException
278
-	 */
279
-	public function insert( $index, $element ) {
280
-		$this->validate_index( $index );
281
-		$this->type->validate_element( $element );
282
-
283
-		$a = array_slice( $this->elements, 0, $index );
284
-		$b = array_slice( $this->elements, $index, count( $this->elements ) );
285
-
286
-		$a[] = $element;
287
-
288
-		return $this->new_from_trusted( array_merge( $a, $b ) );
289
-	}
290
-
291
-	/**
292
-	 * {@inheritdoc}
293
-	 *
294
-	 * @param int   $index    Index to start insertion at.
295
-	 * @param array $elements Elements in insert.
296
-	 *
297
-	 * @return Collection
298
-	 *
299
-	 * @throws OutOfRangeException
300
-	 */
301
-	public function insert_range( $index, array $elements ) {
302
-		$this->validate_index( $index );
303
-		$this->type->validate_elements( $elements );
304
-
305
-		if ( $index < 0 ) {
306
-			$index = $this->count() + $index + 1;
307
-		}
308
-
309
-		return $this->new_from_trusted(
310
-			array_merge(
311
-				array_slice( $this->elements, 0, $index ),
312
-				$elements,
313
-				array_slice( $this->elements, $index, count( $this->elements ) )
314
-			)
315
-		);
316
-	}
317
-
318
-	/**
319
-	 * {@inheritdoc}
320
-	 *
321
-	 * @param  callable $condition Condition to satisfy.
322
-	 *
323
-	 * @return Collection
324
-	 */
325
-	public function reject( $condition ) {
326
-		$inverse = function ( $element ) use ( $condition ) {
327
-			return ! call_user_func( $condition, $element );
328
-		};
329
-
330
-		return $this->filter( $inverse );
331
-	}
332
-
333
-	/**
334
-	 * {@inheritdoc}
335
-	 *
336
-	 * @param  int $index Index to remove.
337
-	 *
338
-	 * @return Collection
339
-	 *
340
-	 * @throws OutOfRangeException
341
-	 */
342
-	public function remove_at( $index ) {
343
-		$this->validate_index( $index );
344
-
345
-		$elements = $this->elements;
346
-
347
-		return $this->new_from_trusted(
348
-			array_merge(
349
-				array_slice( $elements, 0, $index ),
350
-				array_slice( $elements, $index + 1, count( $elements ) )
351
-			)
352
-		);
353
-	}
354
-	/**
355
-	 * {@inheritdoc}
356
-	 *
357
-	 * @return Collection
358
-	 */
359
-	public function reverse() {
360
-		return $this->new_from_trusted(
361
-			array_reverse( $this->elements )
362
-		);
363
-	}
364
-
365
-	/**
366
-	 * {@inheritdoc}
367
-	 *
368
-	 * @param callable $callback Sort callback.
369
-	 *
370
-	 * @return Collection
371
-	 */
372
-	public function sort( $callback ) {
373
-		$elements = $this->elements;
374
-		usort( $elements, $callback );
375
-		return $this->new_from_trusted( $elements );
376
-	}
377
-
378
-	/**
379
-	 * {@inheritdoc}
380
-	 *
381
-	 * @return array
382
-	 */
383
-	public function to_array() {
384
-		return $this->elements;
385
-	}
386
-
387
-	/**
388
-	 * {@inheritdoc}
389
-	 *
390
-	 * @param callable $callable Reducer function.
391
-	 *
392
-	 * @param null     $initial  Initial reducer value.
393
-	 *
394
-	 * @return mixed
395
-	 */
396
-	public function reduce( $callable, $initial = null ) {
397
-		return array_reduce( $this->elements, $callable, $initial );
398
-	}
399
-
400
-	/**
401
-	 * {@inheritdoc}
402
-	 *
403
-	 * @param callable $condition Condition callback.
404
-	 *
405
-	 * @return bool
406
-	 */
407
-	public function every( $condition ) {
408
-		$response = true;
409
-
410
-		foreach ( $this->elements as $element ) {
411
-			$result = call_user_func( $condition, $element );
412
-
413
-			if ( false === $result ) {
414
-				$response = false;
415
-				break;
416
-			}
417
-		}
418
-
419
-		return $response;
420
-	}
421
-
422
-	/**
423
-	 * {@inheritdoc}
424
-	 *
425
-	 * @param  int $num Number of elements to drop.
426
-	 *
427
-	 * @return Collection
428
-	 *
429
-	 * @throws InvalidArgumentException
430
-	 */
431
-	public function drop( $num ) {
432
-		if ( $num > $this->count() ) {
433
-			$num = $this->count();
434
-		}
435
-
436
-		return $this->slice( $num, $this->count() );
437
-	}
438
-
439
-	/**
440
-	 * {@inheritdoc}
441
-	 *
442
-	 * @param int $num Number of elements to drop.
443
-	 *
444
-	 * @return Collection
445
-	 *
446
-	 * @throws InvalidArgumentException
447
-	 */
448
-	public function drop_right( $num ) {
449
-		return $num !== $this->count()
450
-			? $this->slice( 0, $this->count() - $num - 1 )
451
-			: $this->clear();
452
-	}
453
-
454
-	/**
455
-	 * {@inheritdoc}
456
-	 *
457
-	 * @param callable $condition Condition callback.
458
-	 *
459
-	 * @return Collection
460
-	 */
461
-	public function drop_while( $condition ) {
462
-		$count = $this->count_while_true( $condition );
463
-		return $count ? $this->drop( $count ) : $this;
464
-	}
465
-	/**
466
-	 * {@inheritdoc}
467
-	 *
468
-	 * @return Collection
469
-	 *
470
-	 * @throws InvalidArgumentException
471
-	 */
472
-	public function tail() {
473
-		return $this->slice( 1, $this->count() );
474
-	}
475
-
476
-	/**
477
-	 * {@inheritdoc}
478
-	 *
479
-	 * @param  int $num Number of elements to take.
480
-	 *
481
-	 * @return Collection
482
-	 *
483
-	 * @throws InvalidArgumentException
484
-	 */
485
-	public function take( $num ) {
486
-		return $this->slice( 0, $num - 1 );
487
-	}
488
-
489
-	/**
490
-	 * {@inheritdoc}
491
-	 *
492
-	 * @param int $num Number of elements to take.
493
-	 *
494
-	 * @return Collection
495
-	 *
496
-	 * @throws InvalidArgumentException
497
-	 */
498
-	public function take_right( $num ) {
499
-		return $this->slice( $this->count() - $num, $this->count() );
500
-	}
501
-
502
-	/**
503
-	 * {@inheritdoc}
504
-	 *
505
-	 * @param callable $condition Callback function.
506
-	 *
507
-	 * @return Collection
508
-	 */
509
-	public function take_while( $condition ) {
510
-		$count = $this->count_while_true( $condition );
511
-
512
-		return $count ? $this->take( $count ) : $this->clear();
513
-	}
514
-
515
-	/**
516
-	 * {@inheritdoc}
517
-	 *
518
-	 * @param callable $callable Callback function.
519
-	 */
520
-	public function each( $callable ) {
521
-		foreach ( $this->elements as $element ) {
522
-			call_user_func( $callable, $element );
523
-		}
524
-	}
525
-
526
-	/**
527
-	 * {@inheritdoc}
528
-	 *
529
-	 * @param callable $callable Callback function.
530
-	 *
531
-	 * @return Collection
532
-	 */
533
-	public function map( $callable ) {
534
-		$elements = array();
535
-		$type = null;
536
-		foreach ( $this->elements as $element ) {
537
-			$result = call_user_func( $callable, $element );
538
-
539
-			if ( null === $type ) {
540
-				$type = gettype( $result );
541
-
542
-				if ( 'object' === $type ) {
543
-					$type = get_class( $result );
544
-				}
545
-			}
546
-
547
-			$elements[] = $result;
548
-		}
549
-
550
-		return $this->new_from_trusted( $elements, $type ? : $this->get_type() );
551
-	}
552
-
553
-	/**
554
-	 * {@inheritdoc}
555
-	 *
556
-	 * @param callable $callable Reducer function.
557
-	 * @param null     $initial  Initial value.
558
-	 *
559
-	 * @return mixed
560
-	 */
561
-	public function reduce_right( $callable, $initial = null ) {
562
-		return array_reduce(
563
-			array_reverse( $this->elements ),
564
-			$callable,
565
-			$initial
566
-		);
567
-	}
568
-
569
-	/**
570
-	 * {@inheritdoc}
571
-	 *
572
-	 * @return Collection
573
-	 */
574
-	public function shuffle() {
575
-		$elements = $this->elements;
576
-		shuffle( $elements );
577
-
578
-		return $this->new_from_trusted( $elements );
579
-	}
580
-
581
-	/**
582
-	 * {@inheritdoc}
583
-	 *
584
-	 * @param array|Collection $elements Array of elements to merge.
585
-	 *
586
-	 * @return Collection
587
-	 *
588
-	 * @throws InvalidArgumentException
589
-	 */
590
-	public function merge( $elements ) {
591
-		if ( $elements instanceof static ) {
592
-			$elements = $elements->to_array();
593
-		}
594
-
595
-		if ( ! is_array( $elements ) ) {
596
-			throw new InvalidArgumentException( 'Merge must be given array or Collection' );
597
-		}
598
-
599
-		$this->type->validate_elements( $elements );
600
-
601
-		return $this->new_from_trusted(
602
-			array_merge( $this->elements, $elements )
603
-		);
604
-	}
605
-
606
-	/**
607
-	 * {@inheritdoc}
608
-	 *
609
-	 * @return mixed
610
-	 *
611
-	 * @throws OutOfBoundsException
612
-	 */
613
-	public function first() {
614
-		if ( empty( $this->elements ) ) {
615
-			throw new OutOfBoundsException( 'Cannot get first element of empty Collection' );
616
-		}
617
-
618
-		return reset( $this->elements );
619
-	}
620
-
621
-	/**
622
-	 * {@inheritdoc}
623
-	 *
624
-	 * @return mixed
625
-	 *
626
-	 * @throws OutOfBoundsException
627
-	 */
628
-	public function last() {
629
-		if ( empty( $this->elements ) ) {
630
-			throw new OutOfBoundsException( 'Cannot get last element of empty Collection' );
631
-		}
632
-
633
-		return end( $this->elements );
634
-	}
635
-
636
-	/**
637
-	 * {@inheritdoc}
638
-	 *
639
-	 * @return int
640
-	 */
641
-	public function count() {
642
-		return count( $this->elements );
643
-	}
644
-
645
-	/**
646
-	 * {@inheritDoc}
647
-	 *
648
-	 * @return array
649
-	 */
650
-	public function serialize() {
651
-		return $this->map(function( $element ) {
652
-			if ( $element instanceof Serializes ) {
653
-				return $element->serialize();
654
-			}
655
-
656
-			return $element;
657
-		} )->to_array();
658
-	}
659
-
660
-	/**
661
-	 * Return the current element.
662
-	 *
663
-	 * @return mixed
664
-	 */
665
-	public function current() {
666
-		return $this->at( $this->position );
667
-	}
668
-
669
-	/**
670
-	 * Move forward to next element.
671
-	 */
672
-	public function next() {
673
-		$this->position ++;
674
-	}
675
-
676
-	/**
677
-	 * Return the key of the current element.
678
-	 *
679
-	 * @return mixed
680
-	 */
681
-	public function key() {
682
-		return $this->position;
683
-	}
684
-
685
-	/**
686
-	 * Checks if current position is valid.
687
-	 *
688
-	 * @return bool
689
-	 */
690
-	public function valid() {
691
-		return isset( $this->elements[ $this->position ] );
692
-	}
693
-
694
-	/**
695
-	 * Rewind the Iterator to the first element.
696
-	 */
697
-	public function rewind() {
698
-		$this->position = 0;
699
-	}
700
-
701
-	/**
702
-	 * Creates a new instance of the Collection
703
-	 * from a trusted set of elements.
704
-	 *
705
-	 * @param array      $elements Array of elements to pass into new collection.
706
-	 * @param null|mixed $type
707
-	 *
708
-	 * @return static
709
-	 */
710
-	protected function new_from_trusted( array $elements, $type = null ) {
711
-		$collection = new static( null !== $type ? $type : $this->get_type() );
712
-		$collection->set_from_trusted( $elements );
713
-
714
-		return $collection;
715
-	}
716
-
717
-	/**
718
-	 * Sets the elements without validating them.
719
-	 *
720
-	 * @param array $elements Pre-validated elements to set.
721
-	 */
722
-	protected function set_from_trusted( array $elements ) {
723
-		$this->elements = $elements;
724
-	}
725
-
726
-	/**
727
-	 * Number of elements true for the condition.
728
-	 *
729
-	 * @param callable $condition Condition to check.
730
-	 * @return int
731
-	 */
732
-	protected function count_while_true( $condition ) {
733
-		$count = 0;
734
-
735
-		foreach ( $this->elements as $element ) {
736
-			if ( ! $condition($element) ) {
737
-				break;
738
-			}
739
-			$count++;
740
-		}
741
-
742
-		return $count;
743
-	}
744
-
745
-	/**
746
-	 * Validates a number to be used as an index.
747
-	 *
748
-	 * @param  integer $index The number to be validated as an index.
749
-	 *
750
-	 * @throws OutOfRangeException
751
-	 */
752
-	protected function validate_index( $index ) {
753
-		$exists = $this->index_exists( $index );
754
-
755
-		if ( ! $exists ) {
756
-			throw new OutOfRangeException( 'Index out of bounds of collection' );
757
-		}
758
-	}
18
+    /**
19
+     * Collection elements.
20
+     *
21
+     * @var array
22
+     */
23
+    protected $elements = array();
24
+
25
+    /**
26
+     * Collection type to enforce.
27
+     *
28
+     * @var Type
29
+     */
30
+    private $type;
31
+
32
+    /**
33
+     * Where Collection is in loop.
34
+     *
35
+     * @var int
36
+     */
37
+    protected $position = 0;
38
+
39
+    /**
40
+     * Collection constructor.
41
+     *
42
+     * @param string $type
43
+     * @param array  $elements
44
+     */
45
+    public function __construct( $type, array $elements = array() ) {
46
+        $this->type = new Type( $type );
47
+
48
+        if ( $this->type->is_model() ) {
49
+            foreach ( $elements as $idx => $element ) {
50
+                if ( is_array( $element ) ) {
51
+                    $elements[ $idx ] = $this->type->create_model( $element );
52
+                }
53
+            }
54
+        }
55
+
56
+        if ( $elements ) {
57
+            $this->type->validate_elements( $elements );
58
+        }
59
+
60
+        $this->elements = $elements;
61
+    }
62
+
63
+    /**
64
+     * {@inheritdoc}
65
+     *
66
+     * @return string
67
+     */
68
+    public function get_type() {
69
+        return $this->type->get_type();
70
+    }
71
+
72
+    /**
73
+     * {@inheritdoc}
74
+     *
75
+     * @param mixed $element
76
+     *
77
+     * @return Collection
78
+     *
79
+     * @throws InvalidArgumentException
80
+     */
81
+    public function add( $element ) {
82
+        if ( $this->type->is_model() && is_array( $element ) ) {
83
+            $element = $this->type->create_model( $element );
84
+        }
85
+
86
+        $this->type->validate_element( $element );
87
+
88
+        $elements   = $this->elements;
89
+        $elements[] = $element;
90
+
91
+        $collection = new static( $this->get_type() );
92
+        $collection->set_from_trusted( $elements );
93
+
94
+        return $collection;
95
+    }
96
+
97
+    /**
98
+     * {@inheritdoc}
99
+     *
100
+     * @return Collection
101
+     */
102
+    public function clear() {
103
+        return new static( $this->get_type() );
104
+    }
105
+
106
+    /**
107
+     * {@inheritdoc}
108
+     *
109
+     * @param  callable $condition Condition to satisfy.
110
+     *
111
+     * @return bool
112
+     */
113
+    public function contains( $condition ) {
114
+        return (bool) $this->find( $condition );
115
+    }
116
+
117
+    /**
118
+     * {@inheritdoc}
119
+     *
120
+     * @param  callable $condition Condition to satisfy.
121
+     *
122
+     * @return mixed
123
+     */
124
+    public function find( $condition ) {
125
+        $index = $this->find_index( $condition );
126
+
127
+        return -1 === $index ? null : $this->elements[ $index ];
128
+    }
129
+
130
+    /**
131
+     * {@inheritdoc}
132
+     *
133
+     * @param  callable $condition Condition to satisfy.
134
+     *
135
+     * @return int
136
+     */
137
+    public function find_index( $condition ) {
138
+        $index = -1;
139
+
140
+        for ( $i = 0, $count = count( $this->elements ); $i < $count; $i++ ) {
141
+            if ( call_user_func( $condition, ($this->at( $i ) ) ) ) {
142
+                $index = $i;
143
+                break;
144
+            }
145
+        }
146
+
147
+        return $index;
148
+    }
149
+
150
+    /**
151
+     * Fetches the element at the provided index.
152
+     *
153
+     * @param int $index Index to get element from.
154
+     *
155
+     * @return mixed
156
+     *
157
+     * @throws OutOfRangeException
158
+     */
159
+    public function at( $index ) {
160
+        $this->validate_index( $index );
161
+
162
+        return $this->elements[ $index ];
163
+    }
164
+
165
+    /**
166
+     * {@inheritdoc}
167
+     *
168
+     * @param  int $index Index to check for existence.
169
+     *
170
+     * @return bool
171
+     *
172
+     * @throws InvalidArgumentException
173
+     */
174
+    public function index_exists( $index ) {
175
+        if ( ! is_int( $index ) ) {
176
+            throw new InvalidArgumentException( 'Index must be an integer' );
177
+        }
178
+
179
+        if ( $index < 0 ) {
180
+            throw new InvalidArgumentException( 'Index must be a non-negative integer' );
181
+        }
182
+
183
+        return $index < $this->count();
184
+    }
185
+
186
+    /**
187
+     * {@inheritdoc}
188
+     *
189
+     * @param  callable $condition Condition to satisfy.
190
+     *
191
+     * @return mixed
192
+     */
193
+    public function filter( $condition ) {
194
+        $elements = array();
195
+
196
+        foreach ( $this->elements as $element ) {
197
+            if ( call_user_func( $condition, $element ) ) {
198
+                $elements[] = $element;
199
+            }
200
+        }
201
+
202
+        return $this->new_from_trusted( $elements );
203
+    }
204
+    /**
205
+     * {@inheritdoc}
206
+     *
207
+     * @param  callable $condition Condition to satisfy.
208
+     *
209
+     * @return mixed
210
+     */
211
+    public function find_last( $condition ) {
212
+        $index = $this->find_last_index( $condition );
213
+
214
+        return -1 === $index ? null : $this->elements[ $index ];
215
+    }
216
+
217
+    /**
218
+     * {@inheritdoc}
219
+     *
220
+     * @param  callable $condition
221
+     * @return int
222
+     */
223
+    public function find_last_index( $condition ) {
224
+        $index = -1;
225
+
226
+        for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) {
227
+            if ( call_user_func( $condition, $this->elements[ $i ] ) ) {
228
+                $index = $i;
229
+                break;
230
+            }
231
+        }
232
+
233
+        return $index;
234
+    }
235
+
236
+    /**
237
+     * {@inheritdoc}
238
+     *
239
+     * @param  int $start Begining index to slice from.
240
+     * @param  int $end   End index to slice to.
241
+     *
242
+     * @return Collection
243
+     *
244
+     * @throws InvalidArgumentException
245
+     */
246
+    public function slice( $start, $end ) {
247
+        if ( $start < 0 || ! is_int( $start ) ) {
248
+            throw new InvalidArgumentException( 'Start must be a non-negative integer' );
249
+        }
250
+
251
+        if ( $end < 0 || ! is_int( $end ) ) {
252
+            throw new InvalidArgumentException( 'End must be a positive integer' );
253
+        }
254
+
255
+        if ( $start > $end ) {
256
+            throw new InvalidArgumentException( 'End must be greater than start' );
257
+        }
258
+
259
+        if ( $end > $this->count() + 1 ) {
260
+            throw new InvalidArgumentException( 'End must be less than the count of the items in the Collection' );
261
+        }
262
+
263
+        $length = $end - $start + 1;
264
+
265
+        return $this->new_from_trusted( array_slice( $this->elements, $start, $length ) );
266
+    }
267
+
268
+    /**
269
+     * {@inheritdoc}
270
+     *
271
+     * @param int   $index     Index to start at.
272
+     * @param mixed $element Element to insert.
273
+     *
274
+     * @return Collection
275
+     *
276
+     * @throws InvalidArgumentException
277
+     * @throws OutOfRangeException
278
+     */
279
+    public function insert( $index, $element ) {
280
+        $this->validate_index( $index );
281
+        $this->type->validate_element( $element );
282
+
283
+        $a = array_slice( $this->elements, 0, $index );
284
+        $b = array_slice( $this->elements, $index, count( $this->elements ) );
285
+
286
+        $a[] = $element;
287
+
288
+        return $this->new_from_trusted( array_merge( $a, $b ) );
289
+    }
290
+
291
+    /**
292
+     * {@inheritdoc}
293
+     *
294
+     * @param int   $index    Index to start insertion at.
295
+     * @param array $elements Elements in insert.
296
+     *
297
+     * @return Collection
298
+     *
299
+     * @throws OutOfRangeException
300
+     */
301
+    public function insert_range( $index, array $elements ) {
302
+        $this->validate_index( $index );
303
+        $this->type->validate_elements( $elements );
304
+
305
+        if ( $index < 0 ) {
306
+            $index = $this->count() + $index + 1;
307
+        }
308
+
309
+        return $this->new_from_trusted(
310
+            array_merge(
311
+                array_slice( $this->elements, 0, $index ),
312
+                $elements,
313
+                array_slice( $this->elements, $index, count( $this->elements ) )
314
+            )
315
+        );
316
+    }
317
+
318
+    /**
319
+     * {@inheritdoc}
320
+     *
321
+     * @param  callable $condition Condition to satisfy.
322
+     *
323
+     * @return Collection
324
+     */
325
+    public function reject( $condition ) {
326
+        $inverse = function ( $element ) use ( $condition ) {
327
+            return ! call_user_func( $condition, $element );
328
+        };
329
+
330
+        return $this->filter( $inverse );
331
+    }
332
+
333
+    /**
334
+     * {@inheritdoc}
335
+     *
336
+     * @param  int $index Index to remove.
337
+     *
338
+     * @return Collection
339
+     *
340
+     * @throws OutOfRangeException
341
+     */
342
+    public function remove_at( $index ) {
343
+        $this->validate_index( $index );
344
+
345
+        $elements = $this->elements;
346
+
347
+        return $this->new_from_trusted(
348
+            array_merge(
349
+                array_slice( $elements, 0, $index ),
350
+                array_slice( $elements, $index + 1, count( $elements ) )
351
+            )
352
+        );
353
+    }
354
+    /**
355
+     * {@inheritdoc}
356
+     *
357
+     * @return Collection
358
+     */
359
+    public function reverse() {
360
+        return $this->new_from_trusted(
361
+            array_reverse( $this->elements )
362
+        );
363
+    }
364
+
365
+    /**
366
+     * {@inheritdoc}
367
+     *
368
+     * @param callable $callback Sort callback.
369
+     *
370
+     * @return Collection
371
+     */
372
+    public function sort( $callback ) {
373
+        $elements = $this->elements;
374
+        usort( $elements, $callback );
375
+        return $this->new_from_trusted( $elements );
376
+    }
377
+
378
+    /**
379
+     * {@inheritdoc}
380
+     *
381
+     * @return array
382
+     */
383
+    public function to_array() {
384
+        return $this->elements;
385
+    }
386
+
387
+    /**
388
+     * {@inheritdoc}
389
+     *
390
+     * @param callable $callable Reducer function.
391
+     *
392
+     * @param null     $initial  Initial reducer value.
393
+     *
394
+     * @return mixed
395
+     */
396
+    public function reduce( $callable, $initial = null ) {
397
+        return array_reduce( $this->elements, $callable, $initial );
398
+    }
399
+
400
+    /**
401
+     * {@inheritdoc}
402
+     *
403
+     * @param callable $condition Condition callback.
404
+     *
405
+     * @return bool
406
+     */
407
+    public function every( $condition ) {
408
+        $response = true;
409
+
410
+        foreach ( $this->elements as $element ) {
411
+            $result = call_user_func( $condition, $element );
412
+
413
+            if ( false === $result ) {
414
+                $response = false;
415
+                break;
416
+            }
417
+        }
418
+
419
+        return $response;
420
+    }
421
+
422
+    /**
423
+     * {@inheritdoc}
424
+     *
425
+     * @param  int $num Number of elements to drop.
426
+     *
427
+     * @return Collection
428
+     *
429
+     * @throws InvalidArgumentException
430
+     */
431
+    public function drop( $num ) {
432
+        if ( $num > $this->count() ) {
433
+            $num = $this->count();
434
+        }
435
+
436
+        return $this->slice( $num, $this->count() );
437
+    }
438
+
439
+    /**
440
+     * {@inheritdoc}
441
+     *
442
+     * @param int $num Number of elements to drop.
443
+     *
444
+     * @return Collection
445
+     *
446
+     * @throws InvalidArgumentException
447
+     */
448
+    public function drop_right( $num ) {
449
+        return $num !== $this->count()
450
+            ? $this->slice( 0, $this->count() - $num - 1 )
451
+            : $this->clear();
452
+    }
453
+
454
+    /**
455
+     * {@inheritdoc}
456
+     *
457
+     * @param callable $condition Condition callback.
458
+     *
459
+     * @return Collection
460
+     */
461
+    public function drop_while( $condition ) {
462
+        $count = $this->count_while_true( $condition );
463
+        return $count ? $this->drop( $count ) : $this;
464
+    }
465
+    /**
466
+     * {@inheritdoc}
467
+     *
468
+     * @return Collection
469
+     *
470
+     * @throws InvalidArgumentException
471
+     */
472
+    public function tail() {
473
+        return $this->slice( 1, $this->count() );
474
+    }
475
+
476
+    /**
477
+     * {@inheritdoc}
478
+     *
479
+     * @param  int $num Number of elements to take.
480
+     *
481
+     * @return Collection
482
+     *
483
+     * @throws InvalidArgumentException
484
+     */
485
+    public function take( $num ) {
486
+        return $this->slice( 0, $num - 1 );
487
+    }
488
+
489
+    /**
490
+     * {@inheritdoc}
491
+     *
492
+     * @param int $num Number of elements to take.
493
+     *
494
+     * @return Collection
495
+     *
496
+     * @throws InvalidArgumentException
497
+     */
498
+    public function take_right( $num ) {
499
+        return $this->slice( $this->count() - $num, $this->count() );
500
+    }
501
+
502
+    /**
503
+     * {@inheritdoc}
504
+     *
505
+     * @param callable $condition Callback function.
506
+     *
507
+     * @return Collection
508
+     */
509
+    public function take_while( $condition ) {
510
+        $count = $this->count_while_true( $condition );
511
+
512
+        return $count ? $this->take( $count ) : $this->clear();
513
+    }
514
+
515
+    /**
516
+     * {@inheritdoc}
517
+     *
518
+     * @param callable $callable Callback function.
519
+     */
520
+    public function each( $callable ) {
521
+        foreach ( $this->elements as $element ) {
522
+            call_user_func( $callable, $element );
523
+        }
524
+    }
525
+
526
+    /**
527
+     * {@inheritdoc}
528
+     *
529
+     * @param callable $callable Callback function.
530
+     *
531
+     * @return Collection
532
+     */
533
+    public function map( $callable ) {
534
+        $elements = array();
535
+        $type = null;
536
+        foreach ( $this->elements as $element ) {
537
+            $result = call_user_func( $callable, $element );
538
+
539
+            if ( null === $type ) {
540
+                $type = gettype( $result );
541
+
542
+                if ( 'object' === $type ) {
543
+                    $type = get_class( $result );
544
+                }
545
+            }
546
+
547
+            $elements[] = $result;
548
+        }
549
+
550
+        return $this->new_from_trusted( $elements, $type ? : $this->get_type() );
551
+    }
552
+
553
+    /**
554
+     * {@inheritdoc}
555
+     *
556
+     * @param callable $callable Reducer function.
557
+     * @param null     $initial  Initial value.
558
+     *
559
+     * @return mixed
560
+     */
561
+    public function reduce_right( $callable, $initial = null ) {
562
+        return array_reduce(
563
+            array_reverse( $this->elements ),
564
+            $callable,
565
+            $initial
566
+        );
567
+    }
568
+
569
+    /**
570
+     * {@inheritdoc}
571
+     *
572
+     * @return Collection
573
+     */
574
+    public function shuffle() {
575
+        $elements = $this->elements;
576
+        shuffle( $elements );
577
+
578
+        return $this->new_from_trusted( $elements );
579
+    }
580
+
581
+    /**
582
+     * {@inheritdoc}
583
+     *
584
+     * @param array|Collection $elements Array of elements to merge.
585
+     *
586
+     * @return Collection
587
+     *
588
+     * @throws InvalidArgumentException
589
+     */
590
+    public function merge( $elements ) {
591
+        if ( $elements instanceof static ) {
592
+            $elements = $elements->to_array();
593
+        }
594
+
595
+        if ( ! is_array( $elements ) ) {
596
+            throw new InvalidArgumentException( 'Merge must be given array or Collection' );
597
+        }
598
+
599
+        $this->type->validate_elements( $elements );
600
+
601
+        return $this->new_from_trusted(
602
+            array_merge( $this->elements, $elements )
603
+        );
604
+    }
605
+
606
+    /**
607
+     * {@inheritdoc}
608
+     *
609
+     * @return mixed
610
+     *
611
+     * @throws OutOfBoundsException
612
+     */
613
+    public function first() {
614
+        if ( empty( $this->elements ) ) {
615
+            throw new OutOfBoundsException( 'Cannot get first element of empty Collection' );
616
+        }
617
+
618
+        return reset( $this->elements );
619
+    }
620
+
621
+    /**
622
+     * {@inheritdoc}
623
+     *
624
+     * @return mixed
625
+     *
626
+     * @throws OutOfBoundsException
627
+     */
628
+    public function last() {
629
+        if ( empty( $this->elements ) ) {
630
+            throw new OutOfBoundsException( 'Cannot get last element of empty Collection' );
631
+        }
632
+
633
+        return end( $this->elements );
634
+    }
635
+
636
+    /**
637
+     * {@inheritdoc}
638
+     *
639
+     * @return int
640
+     */
641
+    public function count() {
642
+        return count( $this->elements );
643
+    }
644
+
645
+    /**
646
+     * {@inheritDoc}
647
+     *
648
+     * @return array
649
+     */
650
+    public function serialize() {
651
+        return $this->map(function( $element ) {
652
+            if ( $element instanceof Serializes ) {
653
+                return $element->serialize();
654
+            }
655
+
656
+            return $element;
657
+        } )->to_array();
658
+    }
659
+
660
+    /**
661
+     * Return the current element.
662
+     *
663
+     * @return mixed
664
+     */
665
+    public function current() {
666
+        return $this->at( $this->position );
667
+    }
668
+
669
+    /**
670
+     * Move forward to next element.
671
+     */
672
+    public function next() {
673
+        $this->position ++;
674
+    }
675
+
676
+    /**
677
+     * Return the key of the current element.
678
+     *
679
+     * @return mixed
680
+     */
681
+    public function key() {
682
+        return $this->position;
683
+    }
684
+
685
+    /**
686
+     * Checks if current position is valid.
687
+     *
688
+     * @return bool
689
+     */
690
+    public function valid() {
691
+        return isset( $this->elements[ $this->position ] );
692
+    }
693
+
694
+    /**
695
+     * Rewind the Iterator to the first element.
696
+     */
697
+    public function rewind() {
698
+        $this->position = 0;
699
+    }
700
+
701
+    /**
702
+     * Creates a new instance of the Collection
703
+     * from a trusted set of elements.
704
+     *
705
+     * @param array      $elements Array of elements to pass into new collection.
706
+     * @param null|mixed $type
707
+     *
708
+     * @return static
709
+     */
710
+    protected function new_from_trusted( array $elements, $type = null ) {
711
+        $collection = new static( null !== $type ? $type : $this->get_type() );
712
+        $collection->set_from_trusted( $elements );
713
+
714
+        return $collection;
715
+    }
716
+
717
+    /**
718
+     * Sets the elements without validating them.
719
+     *
720
+     * @param array $elements Pre-validated elements to set.
721
+     */
722
+    protected function set_from_trusted( array $elements ) {
723
+        $this->elements = $elements;
724
+    }
725
+
726
+    /**
727
+     * Number of elements true for the condition.
728
+     *
729
+     * @param callable $condition Condition to check.
730
+     * @return int
731
+     */
732
+    protected function count_while_true( $condition ) {
733
+        $count = 0;
734
+
735
+        foreach ( $this->elements as $element ) {
736
+            if ( ! $condition($element) ) {
737
+                break;
738
+            }
739
+            $count++;
740
+        }
741
+
742
+        return $count;
743
+    }
744
+
745
+    /**
746
+     * Validates a number to be used as an index.
747
+     *
748
+     * @param  integer $index The number to be validated as an index.
749
+     *
750
+     * @throws OutOfRangeException
751
+     */
752
+    protected function validate_index( $index ) {
753
+        $exists = $this->index_exists( $index );
754
+
755
+        if ( ! $exists ) {
756
+            throw new OutOfRangeException( 'Index out of bounds of collection' );
757
+        }
758
+    }
759 759
 }
Please login to merge, or discard this patch.