Completed
Push — master ( 431209...0f7fe1 )
by Ítalo
03:12
created

StrictIterableTrait   B

Complexity

Total Complexity 50

Size/Duplication

Total Lines 266
Duplicated Lines 40.6 %

Coupling/Cohesion

Components 0
Dependencies 3

Test Coverage

Coverage 37.3%

Importance

Changes 10
Bugs 2 Features 3
Metric Value
wmc 50
c 10
b 2
f 3
lcom 0
cbo 3
dl 108
loc 266
ccs 47
cts 126
cp 0.373
rs 8.6206

17 Methods

Rating   Name   Duplication   Size   Complexity  
A map() 0 9 2
A take() 0 17 4
A skip() 0 13 3
A skipWhile() 0 16 4
A mapWithKey() 9 9 2
A filter() 11 11 3
A filterWithKey() 11 11 3
A zip() 14 14 3
A takeWhile() 12 12 3
B slice() 19 19 5
A first() 0 8 2
A last() 0 6 1
A each() 0 8 2
A exists() 0 10 3
A concatAll() 12 12 1
A reduce() 0 8 2
B concatRecurse() 20 20 7

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like StrictIterableTrait often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use StrictIterableTrait, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace Collections\Traits;
4
5
use Collections\Iterable;
6
use Collections\VectorInterface;
7
8
trait StrictIterableTrait
9
{
10
    use CommonMutableContainerTrait;
11
12
    /**
13
     * {@inheritDoc}
14
     * @return $this
15
     */
16 1
    public function map(callable $callable)
17
    {
18 1
        $res = new static();
19 1
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
20 1
            $res[] = $callable($v);
21 1
        }
22
23 1
        return $res;
24
    }
25
26
    /**
27
     * {@inheritDoc}
28
     * @return $this
29
     */
30 View Code Duplication
    public function mapWithKey($callback)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
31
    {
32
        $res = new static();
33
        foreach ($this as $k => $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
34
            $res[$k] = $callback($k, $v);
35
        }
36
37
        return $res;
38
    }
39
40
    /**
41
     * {@inheritDoc}
42
     * @return $this
43
     */
44 4 View Code Duplication
    public function filter(callable $callable)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
45
    {
46 2
        $res = new static();
47 2
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
48 2
            if ($callable($v)) {
49 2
                $res[] = $v;
50 2
            }
51 2
        }
52
53 4
        return $res;
54
    }
55
56
    /**
57
     * {@inheritDoc}
58
     * @return $this
59
     */
60 View Code Duplication
    public function filterWithKey($callback)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
61
    {
62
        $res = new static();
63
        foreach ($this as $k => $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
64
            if ($callback($k, $v)) {
65
                $res[$k] = $v;
66
            }
67
        }
68
69
        return $res;
70
    }
71
72
    /**
73
     * {@inheritDoc}
74
     * @return $this
75
     */
76 View Code Duplication
    public function zip(Iterable $iterable)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
77
    {
78
        $res = new static();
79
        $it = $iterable->getIterator();
80
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
81
            if (!$it->valid()) {
82
                break;
83
            }
84
            $res[] = new Pair($v, $it->current());
85
            $it->next();
86
        }
87
88
        return $res;
89
    }
90
91
    /**
92
     * {@inheritDoc}
93
     * @return $this
94
     */
95 1
    public function take($size = 1)
96
    {
97 1
        $res = new static();
98
99 1
        if ($size <= 0) {
100
            return $res;
101
        }
102
103 1
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
104 1
            $res[] = $v;
105 1
            if (--$size === 0) {
106 1
                break;
107
            }
108 1
        }
109
110 1
        return $res;
111
    }
112
113 View Code Duplication
    public function takeWhile(callable $callable)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
114
    {
115
        $res = new static();
116
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
117
            if (!$callable($v)) {
118
                break;
119
            }
120
            $res[] = $v;
121
        }
122
123
        return $res;
124
    }
125
126
    public function skip($n)
127
    {
128
        $res = new static();
129
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
130
            if ($n <= 0) {
131
                $res[] = $v;
132
            } else {
133
                --$n;
134
            }
135
        }
136
137
        return $res;
138
    }
139
140
    public function skipWhile(callable $callable)
141
    {
142
        $res = new static();
143
        $skip = true;
144
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
145
            if ($skip) {
146
                if ($callable($v)) {
147
                    continue;
148
                }
149
                $skip = false;
150
            }
151
            $res[] = $v;
152
        }
153
154
        return $res;
155
    }
156
157 View Code Duplication
    public function slice($start, $length)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
158
    {
159
        $res = new static();
160
        if ($length <= 0) {
161
            return $res;
162
        }
163
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
164
            if ($start !== 0) {
165
                --$start;
166
                continue;
167
            }
168
            $res[] = $v;
169
            if (--$length === 0) {
170
                break;
171
            }
172
        }
173
174
        return $res;
175
    }
176
177 1
    /**
178
     * {@inheritDoc}
179 1
     * @return $this
180
     */
181 1
    public function first()
182 1
    {
183 1
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
184
            return $v;
185 1
        }
186 1
187 1
        return null;
188 1
    }
189
190 1
    /**
191
     * {@inheritDoc}
192
     * @return $this
193
     */
194
    public function last()
195
    {
196
        $result = $this->toArray();
197 2
198
        return array_pop($result);
199 2
    }
200 1
201 1
    /**
202
     * {@inheritDoc}
203 1
     * @return $this
204
     */
205
    public function each(callable $callable)
206
    {
207
        foreach ($this as $v) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
208
            $callable($v);
209
        }
210 2
211
        return $this;
212 2
    }
213
214 2
    /**
215
     * {@inheritdoc}
216
     */
217
    public function exists(callable $fn)
218
    {
219
        foreach ($this as $element) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
220
            if ($fn($element)) {
221
                return true;
222
            }
223
        }
224
225
        return false;
226
    }
227
228 View Code Duplication
    public function concatAll()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
229
    {
230
        /** @var VectorInterface $results */
231
        $results = new static();
232
        $this->each(function (Iterable $subArray) use ($results) {
233 1
            $subArray->each(function ($item) use ($results) {
234
                $results->add($item);
235 1
            });
236 1
        });
237 1
238
        return $results;
239 1
    }
240
241 1
    /**
242
     * {@inheritdoc}
243
     */
244
    public function reduce(callable $callback, $initial = null)
245
    {
246
        foreach ($this as $element) {
0 ignored issues
show
Bug introduced by
The expression $this of type this<Collections\Traits\StrictIterableTrait> is not traversable.
Loading history...
247
            $initial = $callback($initial, $element);
248
        }
249
250
        return $initial;
251
    }
252
253 View Code Duplication
    private function concatRecurse($array, $array1)
0 ignored issues
show
Unused Code introduced by
This method is not used, and could be removed.
Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
254
    {
255
        $merged = $array;
256
257
        foreach ($array1 as $key => $value) {
258
            $isValid = function ($value) {
259
                return (is_array($value) || $value instanceof \Traversable);
260
            };
261
262
            if (($isValid($value) && isset($merged[$key])) && $isValid($merged[$key])) {
263
                $merged[$key] = $this->concatRecurse($merged[$key], $value);
264
            } else {
265
                if (!in_array($value, $merged->toArray())) {
266
                    $merged[] = $value;
267
                }
268
            }
269
        }
270
271
        return $merged;
272
    }
273
}
274