any()   A
last analyzed

Complexity

Conditions 4
Paths 1

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
nc 1
nop 0
dl 0
loc 16
ccs 10
cts 10
cp 1
crap 4
rs 9.7333
c 0
b 0
f 0
1
<?php
2
namespace Aerophant\Ramda;
3
4
/**
5
 * @param callable $predicateFunction
6
 * @param array $array
7
 * @return mixed
8
 */
9
function all()
10
{
11
  $all = function (callable $predicateFunction, array $array): bool {
12 3
    if (empty($array)) {
13 1
      return false;
14
    }
15 2
    foreach ($array as $it) {
16 2
      if (!$predicateFunction($it)) {
17 2
        return false;
18
      }
19
    }
20 1
    return true;
21 3
  };
22 3
  $arguments = func_get_args();
23 3
  $curried = curryN($all, 2);
24 3
  return call_user_func_array($curried, $arguments);
25
}
26
27
/**
28
 * @param callable $predicateFunction
29
 * @param array $array
30
 * @return bool
31
 */
32
function any()
33
{
34
  $any = function (callable $predicateFunction, array $array) {
35 3
    if (empty($array)) {
36 1
      return false;
37
    }
38 2
    foreach ($array as $it) {
39 2
      if ($predicateFunction($it)) {
40 2
        return true;
41
      }
42
    }
43 1
    return false;
44 3
  };
45 3
  $arguments = func_get_args();
46 3
  $curriedAny = curryN($any, 2);
47 3
  return call_user_func_array($curriedAny, $arguments);
48
}
49
50
/**
51
 * @param callable $fn he function to invoke. Receives one argument
52
 * @param array $array The list to iterate over.
53
 * @return null|\Closure
54
 */
55
function arrayForEach()
56
{
57
  $arrayForEach = function (callable $fn, array $array) {
58 1
    foreach ($array as $item) {
59 1
      $fn($item);
60
    }
61 1
  };
62 1
  $arguments = func_get_args();
63 1
  $curriedAny = curryN($arrayForEach, 2);
64 1
  return call_user_func_array($curriedAny, $arguments);
65
}
66
67
/**
68
 * a → [a] → [a]
69
 * @param mixed $item
70
 * @param array $array
71
 * @return array|\Closure
72
 */
73
function append()
74
{
75
  $append = function ($item, array $array) {
76 2
    return array_merge($array, [$item]);
77 2
  };
78 2
  $arguments = func_get_args();
79 2
  $curriedAny = curryN($append, 2);
80 2
  return call_user_func_array($curriedAny, $arguments);
81
}
82
83
/**
84
 * [a] → [a] → [a]
85
 * @param mixed $item
86
 * @param array $array
87
 * @return array|\Closure
88
 */
89
function concat()
90
{
91
  $concat = function (array $firstArray, array $secondArray) {
92 1
    return array_merge($firstArray, $secondArray);
93 1
  };
94 1
  $arguments = func_get_args();
95 1
  $curriedAny = curryN($concat, 2);
96 1
  return call_user_func_array($curriedAny, $arguments);
97
}
98
99
/**
100
 * a → [a] → Boolean
101
 * @param mixed $item item to compare against
102
 * @param array $array The array to consider
103
 * @return boolean|\Closure
104
 */
105
function contains()
106
{
107 2
  $contains = partialRight('in_array', [true]);
108 2
  $arguments = func_get_args();
109 2
  $curriedAny = curryN($contains, 2);
110 2
  return call_user_func_array($curriedAny, $arguments);
111
}
112
113
/**
114
 * @param int $index
115
 * @param array $array
116
 * @return mixed
117
 */
118
function drop()
119
{
120
  $drop = function (int $index, array $array) {
121 12
    return array_merge(array_slice($array, 0, $index), array_slice($array, $index + 1));
122 12
  };
123 12
  $arguments = func_get_args();
124 12
  $curried = curryN($drop, 2);
125 12
  return call_user_func_array($curried, $arguments);
126
}
127
128
/**
129
 * @param array $array
130
 * @return mixed
131
 */
132
function dropFirst()
133
{
134 2
  $dropFirst = drop(0);
135 2
  $arguments = func_get_args();
136 2
  $curried = curryN($dropFirst, 1);
137 2
  return call_user_func_array($curried, $arguments);
138
}
139
140
/**
141
 * @param array $array
142
 * @return mixed
143
 */
144
function dropLast()
145
{
146
  $dropLast = function (array $array) {
147 1
    $index = count($array)-1;
148 1
    return array_merge(array_slice($array, 0, $index), array_slice($array, $index + 1));
149 1
  };
150
151 1
  $arguments = func_get_args();
152 1
  $curried = curryN($dropLast, 1);
153 1
  return call_user_func_array($curried, $arguments);
154
}
155
156
/**
157
 * @param string|array $suffix
158
 * @param string|array $list
159
 * @return boolean|\Closure
160
 */
161
function endsWith()
162
{
163
  $endsWith = function ($suffix, $list) {
164 7
    if (is_string($suffix) && is_string($list)) {
165 3
      return $suffix === '' || (($temp = strlen($list) - strlen($suffix)) >= 0 && strpos($list, $suffix) !== false);
0 ignored issues
show
Unused Code introduced by
The assignment to $temp is dead and can be removed.
Loading history...
166
    }
167 4
    if (is_array($suffix) && is_array($list)) {
168 3
      $index = count($list) - count($suffix);
169 3
      foreach ($suffix as $it) {
170 2
        if ($it != $list[$index]) {
171 1
          return false;
172
        }
173 1
        $index++;
174
      }
175 2
      return true;
176
    }
177 1
    throw new \InvalidArgumentException(__FUNCTION__ . 'accepts only string or array as it arguments');
178 7
  };
179 7
  $arguments = func_get_args();
180 7
  $curried = curryN($endsWith, 2);
181 7
  return call_user_func_array($curried, $arguments);
182
}
183
184
/**
185
 * @param callable $predicateFunction
186
 * @param array $array
187
 * @return mixed
188
 */
189
function filter()
190
{
191
  $filter = function (callable $predicateFunction, array $array) {
192 1
     return array_values(array_filter($array, $predicateFunction));
193 1
  };
194 1
  $arguments = func_get_args();
195 1
  $curried = curryN($filter, 2);
196 1
  return call_user_func_array($curried, $arguments);
197
}
198
199
/**
200
 * @param callable $predicateFunction
201
 * @param array $array
202
 * @return mixed
203
 */
204
function filterPreserveKey()
205
{
206
  $filter = function (callable $predicateFunction, array $array) {
207 1
    return array_filter($array, $predicateFunction);
208 1
  };
209 1
  $arguments = func_get_args();
210 1
  $curried = curryN($filter, 2);
211 1
  return call_user_func_array($curried, $arguments);
212
}
213
214
/**
215
 * @param callable $predicateFunction
216
 * @param array $list
217
 * @return mixed
218
 */
219
function find()
220
{
221
  $find = function (callable $predicateFunction, array $list) {
222 2
    foreach ($list as $item) {
223 2
      if ($predicateFunction($item)) {
224 2
        return $item;
225
      }
226
    }
227 1
    return null;
228 2
  };
229 2
  $arguments = func_get_args();
230 2
  $curried = curryN($find, 2);
231 2
  return call_user_func_array($curried, $arguments);
232
}
233
234
function first()
235
{
236
  $first = function (array $array) {
237 2
    if (empty($array)) {
238 1
      return null;
239
    }
240 1
    return $array[0];
241 2
  };
242 2
  $arguments = func_get_args();
243 2
  $curried = curryN($first, 1);
244 2
  return call_user_func_array($curried, $arguments);
245
}
246
247
/**
248
 * @param array $array
249
 * @return array|\Closure
250
 */
251
function flatten()
252
{
253
  $flatten = function (array $array) use (&$flatten) {
254
    $accumulator = function ($acc, $item) use ($flatten) {
255 1
      if (is_array($item)) {
256 1
        return array_merge($acc, $flatten($item));
257
      }
258 1
      $acc[] = $item;
259 1
      return $acc;
260 1
    };
261 1
    return array_reduce($array, $accumulator, []);
262 1
  };
263 1
  $arguments = func_get_args();
264 1
  $curried = curryN($flatten, 1);
265 1
  return call_user_func_array($curried, $arguments);
266
}
267
268
/**
269
 * @param callable $keySelector
270
 * @param array $array
271
 * @return array
272
 */
273
function groupBy()
274
{
275
  $groupBy = function (callable $keySelector, array $array) {
276
    $accumulator = function ($acc, $item) use ($keySelector) {
277 2
      $key = $keySelector($item);
278 2
      $acc[$key] = array_key_exists($key, $acc) ? array_merge($acc[$key], [$item]) : [$item];
279 2
      return $acc;
280 2
    };
281 2
    return array_reduce($array, $accumulator, []);
282 2
  };
283 2
  $arguments = func_get_args();
284 2
  $curried = curryN($groupBy, 2);
285 2
  return call_user_func_array($curried, $arguments);
286
}
287
288
/**
289
 * @param int $index
290
 * @param mixed $element
291
 * @param array $array
292
 * @return array|\Closure
293
 */
294
function insert()
295
{
296
  $insert = function (int $index, $element, array $array) {
297 3
    return array_merge(
298 3
      array_slice($array, 0, $index),
299 3
      [$element],
300 3
      array_slice($array, $index)
301
    );
302 3
  };
303 3
  $arguments = func_get_args();
304 3
  $curried = curryN($insert, 3);
305 3
  return call_user_func_array($curried, $arguments);
306
}
307
308
/**
309
 * @param string $string
310
 * @param array $array
311
 * @return string
312
 */
313
function join()
314
{
315 1
  $arguments = func_get_args();
316 1
  $curried = curryN('implode', 2);
317 1
  return call_user_func_array($curried, $arguments);
318
}
319
320
function last()
321
{
322
  $last = function (array $array) {
323 2
    if (empty($array)) {
324 1
      return null;
325
    }
326 1
    return $array[count($array) - 1];
327 2
  };
328 2
  $arguments = func_get_args();
329 2
  $curried = curryN($last, 1);
330 2
  return call_user_func_array($curried, $arguments);
331
}
332
333
function length()
334
{
335 1
  $arguments = func_get_args();
336 1
  $curried = curryN('count', 1);
337 1
  return call_user_func_array($curried, $arguments);
338
}
339
340
/**
341
 * @param callable $mapper
342
 * @param array $array
343
 * @return mixed
344
 */
345
function map()
346
{
347 1
  $arguments = func_get_args();
348 1
  $curried = curryN('array_map', 2);
349 1
  return call_user_func_array($curried, $arguments);
350
}
351
352
/**
353
 * @param mixed $firstValue
354
 * @param mixed $secondValue
355
 * @return array|\Closure
356
 */
357
function pair()
358
{
359
  $pair = function ($firstValue, $secondValue) {
360 1
    return [$firstValue, $secondValue];
361 1
  };
362 1
  $arguments = func_get_args();
363 1
  $curried = curryN($pair, 2);
364 1
  return call_user_func_array($curried, $arguments);
365
}
366
367
/**
368
 * a → [a] → [a]
369
 * @param mixed $item
370
 * @param array $array
371
 * @return array|\Closure
372
 */
373
function prepend()
374
{
375
  $prepend = function ($item, array $array) {
376 2
    return array_merge([$item], $array);
377 2
  };
378 2
  $arguments = func_get_args();
379 2
  $curriedAny = curryN($prepend, 2);
380 2
  return call_user_func_array($curriedAny, $arguments);
381
}
382
383
/**
384
 * Returns a list of numbers from from (inclusive) to to (inclusive).
385
 * @param int|float|double $from
386
 * @param int|float|double $to
387
 * @return array|\Closure
388
 */
389
function range()
390
{
391 3
  $arguments = func_get_args();
392 3
  $curriedAny = curryN('range', 2);
393 3
  return call_user_func_array($curriedAny, $arguments);
394
}
395
396
/**
397
 * @param callable $accumulator
398
 * @param mixed $initialValue
399
 * @param array $array
400
 * @return mixed
401
 */
402
function reduce()
403
{
404
  $reduce = function (callable $accumulator, $initialValue, array $array) {
405 12
    return array_reduce($array, $accumulator, $initialValue);
406 12
  };
407 12
  $arguments = func_get_args();
408 12
  $curried = curryN($reduce, 3);
409 12
  return call_user_func_array($curried, $arguments);
410
}
411
412
/**
413
 * @param callable $predicate
414
 * @param array $array
415
 * @return array|\Closure
416
 */
417
function reject()
418
{
419
  $reject = function ($predicate, array $array) {
420 1
    return array_values(array_filter($array, compose(not(), $predicate)));
421 1
  };
422 1
  $arguments = func_get_args();
423 1
  $curried = curryN($reject, 2);
424 1
  return call_user_func_array($curried, $arguments);
425
}
426
427
/**
428
 * @param callable $predicate
429
 * @param array $array
430
 * @return array|\Closure
431
 */
432
function rejectPreserveKey()
433
{
434
  $reject = function ($predicate, array $array) {
435 1
    return array_filter($array, compose(not(), $predicate));
436 1
  };
437 1
  $arguments = func_get_args();
438 1
  $curried = curryN($reject, 2);
439 1
  return call_user_func_array($curried, $arguments);
440
}
441
442
/**
443
 * Number → Number → [a] → [a]
444
 * @param int $start
445
 * @param int $count
446
 * @param array $array
447
 * @return mixed
448
 */
449
function remove()
450
{
451
  $remove = function (int $start, int $count, array $array) {
452 1
    return array_merge(array_slice($array, 0, $start), array_slice($array, $start + $count));
453 1
  };
454 1
  $arguments = func_get_args();
455 1
  $curried = curryN($remove, 3);
456 1
  return call_user_func_array($curried, $arguments);
457
}
458
459
/**
460
 * @param mixed $item
461
 * @param int $count
462
 * @return array|\Closure
463
 */
464
function repeat()
465
{
466
  $repeat = function ($item, int $count) {
467 1
    return array_reduce(
468 1
      range(1, $count),
0 ignored issues
show
Bug introduced by
It seems like range(1, $count) can also be of type Closure; however, parameter $input of array_reduce() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

468
      /** @scrutinizer ignore-type */ range(1, $count),
Loading history...
469
      function ($acc, $unsedItem) use ($item) {
0 ignored issues
show
Unused Code introduced by
The parameter $unsedItem is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

469
      function ($acc, /** @scrutinizer ignore-unused */ $unsedItem) use ($item) {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
470 1
        return array_merge($acc, [$item]);
471 1
      },
472 1
      []
473
    );
474 1
  };
475 1
  $arguments = func_get_args();
476 1
  $curried = curryN($repeat, 2);
477 1
  return call_user_func_array($curried, $arguments);
478
}
479
480
/**
481
 * @param array|string $list
482
 * @return array|string|\Closure
483
 */
484
function reverse()
485
{
486
  $reverse = function ($list) {
487 5
    if (is_array($list)) {
488 2
      return array_reverse($list);
489
    }
490 3
    if (is_string($list)) {
491 2
      return strrev($list);
492
    }
493 1
    throw new \InvalidArgumentException('reverse() only support string or array as an argument');
494 5
  };
495 5
  $arguments = func_get_args();
496 5
  $curried = curryN($reverse, 1);
497 5
  return call_user_func_array($curried, $arguments);
498
}
499
500
/**
501
 * @param int $fromIndex
502
 * @param int $toIndex
503
 * @param mixed $list
504
 * @return array|string|\Closure
505
 */
506
function slice()
507
{
508
  $slice = function (int $fromIndex, int $toIndex, $list) {
509 8
    if (is_array($list)) {
510 4
      $listCount =  count($list);
511 4
      $actualFromIndex = $fromIndex < 0 ? $listCount + $fromIndex : $fromIndex;
512 4
      $actualToIndex = $toIndex < 0 ? $listCount + $toIndex : $toIndex;
513 4
      return array_slice($list, $actualFromIndex, $actualToIndex - $actualFromIndex);
514
    }
515 4
    if (is_string($list)) {
516 4
      $listCount =  strlen($list);
517 4
      $actualFromIndex = $fromIndex < 0 ? $listCount + $fromIndex : $fromIndex;
518 4
      $actualToIndex = $toIndex < 0 ? $listCount + $toIndex : $toIndex;
519 4
      return substr($list, $actualFromIndex, $actualToIndex - $actualFromIndex);
520
    }
521
    throw new \InvalidArgumentException('slice() only support array and string');
522 8
  };
523 8
  $arguments = func_get_args();
524 8
  $curried = curryN($slice, 3);
525 8
  return call_user_func_array($curried, $arguments);
526
}
527
528
/**
529
 * @param callable $comparator
530
 * @param array $array
531
 * @return array|\Closure
532
 */
533
function sort()
534
{
535
  $sort = function (callable $comparator, array $array) {
536 1
    usort($array, $comparator);
537 1
    return $array;
538 1
  };
539 1
  $arguments = func_get_args();
540 1
  $curried = curryN($sort, 2);
541 1
  return call_user_func_array($curried, $arguments);
542
}
543
544
/**
545
 * @param callable $keySelector
546
 * @param array $array
547
 * @return array|\Closure
548
 */
549
function sortBy()
550
{
551
  $sortBy = function (callable $keySelector, array $array) {
552 1
    $groupedArray = groupBy($keySelector, $array);
553 1
    ksort($groupedArray);
554 1
    return apply('array_merge', array_values($groupedArray));
555 1
  };
556 1
  $arguments = func_get_args();
557 1
  $curried = curryN($sortBy, 2);
558 1
  return call_user_func_array($curried, $arguments);
559
}
560
561
/**
562
 * @param string|array $prefix
563
 * @param string|array $list
564
 * @return boolean|\Closure
565
 */
566
function startsWith($prefix = null, $list = null)
567
{
568
  $startsWith = function ($prefix, $list) {
569 7
    if (is_string($prefix) && is_string($list)) {
570 3
      return $prefix === '' || strpos($list, $prefix) === 0;
571
    }
572 4
    if (is_array($prefix) && is_array($list)) {
573 3
      foreach ($prefix as $key => $it) {
574 2
        if ($it != $list[$key]) {
575 2
          return false;
576
        };
577
      }
578 2
      return true;
579
    }
580 1
    throw new \InvalidArgumentException(__FUNCTION__ . 'accepts only string or array as it arguments');
581 7
  };
582 7
  $arguments = func_get_args();
583 7
  $curried = curryN($startsWith, 2);
584 7
  return call_user_func_array($curried, $arguments);
585
}
586
587
function tail()
588
{
589
  $tail = function (array $array) {
590 2
    if (empty($array)) {
591 1
      return null;
592
    }
593 1
    return $array[count($array) - 1];
594 2
  };
595 2
  $arguments = func_get_args();
596 2
  $curried = curryN($tail, 1);
597 2
  return call_user_func_array($curried, $arguments);
598
}
599