GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — develop ( d7c813...4aa098 )
by Baptiste
02:24
created

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
declare(strict_types = 1);
3
4
namespace Innmind\Immutable;
5
6
use Innmind\Immutable\Exception\InvalidArgumentException;
7
8
class Set implements SetInterface
9
{
10
    use Type;
11
12
    private $type;
13
    private $spec;
14
    private $values;
15
16 19
    public function __construct(string $type)
17
    {
18 19
        $this->type = $type;
19 19
        $this->spec = $this->getSpecFor($type);
20 19
        $this->values = new Sequence;
21 19
    }
22
23
    /**
24
     * {@inheritdoc}
25
     */
26 11
    public function type(): string
27
    {
28 11
        return $this->type;
29
    }
30
31
    /**
32
     * {@inheritdoc}
33
     */
34 2
    public function size(): int
35
    {
36 2
        return $this->values->size();
37
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42 1
    public function count(): int
43
    {
44 1
        return $this->values->size();
45
    }
46
47
    /**
48
     * {@inheritdoc}
49
     */
50 9
    public function toPrimitive()
51
    {
52 9
        return $this->values->toPrimitive();
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58 1
    public function current()
59
    {
60 1
        return $this->values->current();
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66 1
    public function key()
67
    {
68 1
        return $this->values->key();
69
    }
70
71
    /**
72
     * {@inheritdoc}
73
     */
74 1
    public function next()
75
    {
76 1
        $this->values->next();
77 1
    }
78
79
    /**
80
     * {@inheritdoc}
81
     */
82 1
    public function rewind()
83
    {
84 1
        $this->values->rewind();
85 1
    }
86
87
    /**
88
     * {@inheritdoc}
89
     */
90 1
    public function valid()
91
    {
92 1
        return $this->values->valid();
93
    }
94
95
    /**
96
     * {@inheritdoc}
97
     */
98 2 View Code Duplication
    public function intersect(SetInterface $set): SetInterface
0 ignored issues
show
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...
99
    {
100 2
        $this->validate($set);
101
102 1
        $newSet = clone $this;
103 1
        $newSet->values = $this->values->intersect($set->values);
0 ignored issues
show
Accessing values on the interface Innmind\Immutable\SetInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
104
105 1
        return $newSet;
106
    }
107
108
    /**
109
     * {@inheritdoc}
110
     */
111 15
    public function add($element): SetInterface
112
    {
113 15
        $this->spec->validate($element);
114
115 14
        if ($this->contains($element)) {
116 1
            return $this;
117
        }
118
119 14
        $set = clone $this;
120 14
        $set->values = $this->values->add($element);
121
122 14
        return $set;
123
    }
124
125
    /**
126
     * {@inheritdoc}
127
     */
128 14
    public function contains($element): bool
129
    {
130 14
        return $this->values->contains($element);
131
    }
132
133
    /**
134
     * {@inheritdoc}
135
     */
136 1
    public function remove($element): SetInterface
137
    {
138 1
        if (!$this->contains($element)) {
139
            return $this;
140
        }
141
142 1
        $index = $this->values->indexOf($element);
143 1
        $set = clone $this;
144 1
        $set->values = (new Sequence)
145 1
            ->append($this->values->slice(0, $index))
146 1
            ->append($this->values->slice($index + 1, $this->size()));
147
148 1
        return $set;
149
    }
150
151
    /**
152
     * {@inheritdoc}
153
     */
154 2 View Code Duplication
    public function diff(SetInterface $set): SetInterface
0 ignored issues
show
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...
155
    {
156 2
        $this->validate($set);
157
158 1
        $newSet = clone $this;
159 1
        $newSet->values = $this->values->diff($set->values);
0 ignored issues
show
Accessing values on the interface Innmind\Immutable\SetInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
160
161 1
        return $newSet;
162
    }
163
164
    /**
165
     * {@inheritdoc}
166
     */
167 2
    public function equals(SetInterface $set): bool
168
    {
169 2
        $this->validate($set);
170
171 1
        return $this->values->equals($set->values);
0 ignored issues
show
Accessing values on the interface Innmind\Immutable\SetInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
172
    }
173
174
    /**
175
     * {@inheritdoc}
176
     */
177 1
    public function filter(\Closure $predicate): SetInterface
178
    {
179 1
        $set = clone $this;
180 1
        $set->values = $this->values->filter($predicate);
181
182 1
        return $set;
183
    }
184
185
    /**
186
     * {@inheritdoc}
187
     */
188 1
    public function foreach(\Closure $function): SetInterface
189
    {
190 1
        $this->values->foreach($function);
191
192 1
        return $this;
193
    }
194
195
    /**
196
     * {@inheritdoc}
197
     */
198 1
    public function groupBy(\Closure $discriminator): MapInterface
199
    {
200 1
        return $this->values->groupBy($discriminator);
201
    }
202
203
    /**
204
     * {@inheritdoc}
205
     */
206 1
    public function map(\Closure $function): SetInterface
207
    {
208 1
        $set = clone $this;
209 1
        $set->values = $this->values->map($function);
210
211 1
        return $set;
212
    }
213
214
    /**
215
     * {@inheritdoc}
216
     */
217 1
    public function partition(\Closure $predicate): SequenceInterface
218
    {
219 1
        $truthy = clone $this;
220 1
        $falsy = clone $this;
221 1
        $partitions = $this->values->partition($predicate);
222 1
        $truthy->values = $partitions->get(0);
223 1
        $falsy->values = $partitions->get(1);
224
225 1
        return new Sequence($truthy, $falsy);
226
    }
227
228
    /**
229
     * {@inheritdoc}
230
     */
231 1
    public function join(string $separator): StringPrimitive
232
    {
233 1
        return $this->values->join($separator);
234
    }
235
236
    /**
237
     * {@inheritdoc}
238
     */
239 1
    public function sort(\Closure $function): SequenceInterface
240
    {
241 1
        return $this->values->sort($function);
242
    }
243
244
    /**
245
     * Make sure the set is compatible with the current one
246
     *
247
     * @param SetInterface $set
248
     *
249
     * @throws InvalidArgumentException
250
     *
251
     * @return void
252
     */
253 6
    private function validate(SetInterface $set)
254
    {
255 6
        if ($set->type() !== $this->type) {
256 3
            throw new InvalidArgumentException(
257 3
                'The 2 sets does not reference the same type'
258
            );
259
        }
260 3
    }
261
}
262