-
Notifications
You must be signed in to change notification settings - Fork 4
/
ArrayList.php
136 lines (123 loc) · 3.15 KB
/
ArrayList.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php declare(strict_types=1);
/**
* This file is part of the Phootwork package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
* @copyright Thomas Gossmann
*/
namespace phootwork\collection;
use Iterator;
use phootwork\lang\parts\AccessorsPart;
use phootwork\lang\parts\AddPart;
use phootwork\lang\parts\IndexFindersPart;
use phootwork\lang\parts\InsertPart;
/**
* Represents a List
*
* @author Thomas Gossmann
* @author Cristiano Cinotti
*/
class ArrayList extends AbstractList {
use AccessorsPart {
get as traitGet;
}
use AddPart;
use IndexFindersPart {
indexOf as traitIndexOf;
findLastIndex as traitFindLastIndex;
findIndex as traitFindIndex;
}
use InsertPart;
/**
* Creates a new ArrayList
*
* @param array|Iterator $collection
*/
public function __construct(array|Iterator $collection = []) {
/** @var mixed $element */
foreach ($collection as $element) {
$this->add($element);
}
}
/**
* Removes an element from the list by its index.
*
* @param int $index
*
* @return ArrayList
*/
public function removeByIndex(int $index): self {
if (isset($this->array[$index])) {
unset($this->array[$index]);
if (!array_is_list($this->array)) {
$this->array = array_values($this->array);
}
}
return $this;
}
/**
* Returns the element at the given index (or null if the index isn't present)
*
* @param int $index
*
* @return mixed
*/
public function get(int $index): mixed {
return $this->traitGet($index);
}
/**
* Returns the index of the given element or null if the element can't be found
*
* @param mixed $element
*
* @return int|null the index for the given element
*/
public function indexOf(mixed $element): ?int {
$index = $this->traitIndexOf($element);
return $index === null ? $index : (int) $index;
}
/**
* Searches the array with a given callback and returns the index for the last element if found.
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - find($query, callback)
* - find(callback)
*
* @param array $arguments
*
* @return int|null the index or null if it hasn't been found
*/
public function findLastIndex(mixed ...$arguments): ?int {
$lastIndex = $this->traitFindLastIndex(...$arguments);
return $lastIndex === null ? $lastIndex : (int) $lastIndex;
}
/**
* Searches the array with a given callback and returns the index for the first element if found.
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - find($query, callback)
* - find(callback)
*
* @param array $arguments
*
* @return int|null the index or null if it hasn't been found
*/
public function findIndex(mixed ...$arguments): ?int {
$index = $this->traitFindIndex(...$arguments);
return $index === null ? $index : (int) $index;
}
}