Completed
Push — master ( 1e032b...d01fce )
by Nate
02:22
created

AbstractCollection::filter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
/*
3
 * Copyright (c) Nate Brunette.
4
 * Distributed under the MIT License (http://opensource.org/licenses/MIT)
5
 */
6
7
namespace Tebru\Collection;
8
9
/**
10
 * Class AbstractCollection
11
 *
12
 * Provides a skeletal implementation of the [@see CollectionInterface]
13
 *
14
 * @author Nate Brunette <[email protected]>
15
 */
16
abstract class AbstractCollection implements CollectionInterface
17
{
18
    /**
19
     * Ensure all elements of a collection exists in this collection
20
     *
21
     * Return true if the collection has changed, and false if it hasn't
22
     *
23
     * @param CollectionInterface $collection
24
     * @return bool
25
     */
26 3
    public function addAll(CollectionInterface $collection): bool
27
    {
28 3
        return $this->addAllArray($collection->toArray());
29
    }
30
31
    /**
32
     * Ensure all elements of an array exists in this collection
33
     *
34
     * Return true if the collection has changed, and false if it hasn't
35
     *
36
     * @param array $collection
37
     * @return bool
38
     */
39 63
    public function addAllArray(array $collection): bool
40
    {
41 63
        $size = $this->count();
42 63
        foreach ($collection as $element) {
43 63
            $this->add($element);
44
        }
45
46 63
        return $size !== $this->count();
47
    }
48
49
    /**
50
     * Returns true if the collection contains element
51
     *
52
     * @param mixed $element
53
     * @return bool
54
     */
55 40
    public function contains($element): bool
56
    {
57 40
        return in_array($element, $this->toArray(), true);
58
    }
59
60
    /**
61
     * Returns true if the collection contains all elements from another collection
62
     *
63
     * @param CollectionInterface $collection
64
     * @return bool
65
     */
66 9
    public function containsAll(CollectionInterface $collection): bool
67
    {
68 9
        return $this->containsAllArray($collection->toArray());
69
    }
70
71
    /**
72
     * Returns true if the collection contains all elements from an array
73
     *
74
     * @param array $collection
75
     * @return bool
76
     */
77 12
    public function containsAllArray(array $collection): bool
78
    {
79 12
        foreach ($collection as $element) {
80 12
            if (!$this->contains($element)) {
81 12
                return false;
82
            }
83
        }
84
85 9
        return true;
86
    }
87
88
    /**
89
     * Returns the size of the collection
90
     *
91
     * @return int
92
     */
93 75
    public function count(): int
94
    {
95 75
        return count($this->toArray());
96
    }
97
98
    /**
99
     * Returns true if the collection is empty
100
     *
101
     * @return bool
102
     */
103 6
    public function isEmpty(): bool
104
    {
105 6
        return 0 === $this->count();
106
    }
107
108
    /**
109
     * Remove all items in a collection from this collection
110
     *
111
     * Returns true if the collection was modified
112
     *
113
     * @param CollectionInterface $collection
114
     * @return bool
115
     */
116 9
    public function removeAll(CollectionInterface $collection): bool
117
    {
118 9
        return $this->removeAllArray($collection->toArray());
119
    }
120
121
    /**
122
     * Remove all items in an array from this collection
123
     *
124
     * Returns true if the collection was modified
125
     *
126
     * @param array $collection
127
     * @return bool
128
     */
129 12
    public function removeAllArray(array $collection): bool
130
    {
131 12
        $size = $this->count();
132 12
        foreach ($collection as $element) {
133 12
            $this->remove($element);
134
        }
135
136 12
        return $size !== $this->count();
137
    }
138
139
    /**
140
     * Remove all items from this collection that don't exist in specified collection
141
     *
142
     * Returns true if the collection was modified
143
     *
144
     * @param CollectionInterface $collection
145
     * @return bool
146
     */
147 9
    public function retainAll(CollectionInterface $collection): bool
148
    {
149 9
        return $this->retainAllArray($collection->toArray());
150
    }
151
152
    /**
153
     * Remove all items from this collection that don't exist in specified array
154
     *
155
     * Returns true if the collection was modified
156
     *
157
     * @param array $collection
158
     * @return bool
159
     */
160 12
    public function retainAllArray(array $collection): bool
161
    {
162 12
        $size = $this->count();
163 12
        foreach ($this as $element) {
164 12
            if (!in_array($element, $collection, true)) {
165 12
                $this->remove($element);
166
            }
167
        }
168
169 12
        return $size !== $this->count();
170
    }
171
172
    /**
173
     * Find the first element in collection
174
     *
175
     * The closure will get passed each element.  Returning true will end the
176
     * loop and return that element
177
     *
178
     * @param callable $find
179
     * @return mixed
180
     */
181 6
    public function find(callable $find)
182
    {
183 6
        foreach ($this as $element) {
184 6
            if (true === $find($element)) {
185 6
                return $element;
186
            }
187
        }
188
189 3
        return null;
190
    }
191
192
    /**
193
     * Filter the collection using closure
194
     *
195
     * The closure will get passed each element.  Returning true from the
196
     * closure will include that element in the new collection.
197
     *
198
     * @param callable $filter
199
     * @return CollectionInterface
200
     */
201 3
    public function filter(callable $filter): CollectionInterface
202
    {
203 3
        return new static(array_filter($this->toArray(), $filter));
0 ignored issues
show
Unused Code introduced by
The call to AbstractCollection::__construct() has too many arguments starting with array_filter($this->toArray(), $filter).

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
204
    }
205
206
    /**
207
     * Use a closure to determine existence in the collection
208
     *
209
     * The closure will get passed each element.  Returning true from the
210
     * closure will return true from this method.
211
     *
212
     * @param callable $exists
213
     * @return bool
214
     */
215 3
    public function exists(callable $exists): bool
216
    {
217 3
        foreach ($this as $element) {
218 3
            if (true === $exists($element)) {
219 3
                return true;
220
            }
221
        }
222
223 3
        return false;
224
    }
225
}
226