Completed
Push — master ( 8871bc...78797b )
by Siwapun
03:45
created

sort()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
ccs 6
cts 6
cp 1
crap 1
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
function head()
289
{
290
  $head = function (array $array) {
291 2
    if (empty($array)) {
292 1
      return null;
293
    }
294 1
    return $array[0];
295 2
  };
296 2
  $arguments = func_get_args();
297 2
  $curried = curryN($head, 1);
298 2
  return call_user_func_array($curried, $arguments);
299
}
300
301
/**
302
 * @param int $index
303
 * @param mixed $element
304
 * @param array $array
305
 * @return array|\Closure
306
 */
307
function insert()
308
{
309
  $insert = function (int $index, $element, array $array) {
310 3
    return array_merge(
311 3
      array_slice($array, 0, $index),
312 3
      [$element],
313 3
      array_slice($array, $index)
314
    );
315 3
  };
316 3
  $arguments = func_get_args();
317 3
  $curried = curryN($insert, 3);
318 3
  return call_user_func_array($curried, $arguments);
319
}
320
321
/**
322
 * @param string $string
323
 * @param array $array
324
 * @return string
325
 */
326
function join()
327
{
328 1
  $arguments = func_get_args();
329 1
  $curried = curryN('implode', 2);
330 1
  return call_user_func_array($curried, $arguments);
331
}
332
333
function last()
334
{
335
  $last = function (array $array) {
336 2
    if (empty($array)) {
337 1
      return null;
338
    }
339 1
    return $array[count($array) - 1];
340 2
  };
341 2
  $arguments = func_get_args();
342 2
  $curried = curryN($last, 1);
343 2
  return call_user_func_array($curried, $arguments);
344
}
345
346
function length()
347
{
348 1
  $arguments = func_get_args();
349 1
  $curried = curryN('count', 1);
350 1
  return call_user_func_array($curried, $arguments);
351
}
352
353
/**
354
 * @param callable $mapper
355
 * @param array $array
356
 * @return mixed
357
 */
358
function map()
359
{
360 1
  $arguments = func_get_args();
361 1
  $curried = curryN('array_map', 2);
362 1
  return call_user_func_array($curried, $arguments);
363
}
364
365
/**
366
 * @param mixed $firstValue
367
 * @param mixed $secondValue
368
 * @return array|\Closure
369
 */
370
function pair()
371
{
372
  $pair = function ($firstValue, $secondValue) {
373 1
    return [$firstValue, $secondValue];
374 1
  };
375 1
  $arguments = func_get_args();
376 1
  $curried = curryN($pair, 2);
377 1
  return call_user_func_array($curried, $arguments);
378
}
379
380
/**
381
 * a → [a] → [a]
382
 * @param mixed $item
383
 * @param array $array
384
 * @return array|\Closure
385
 */
386
function prepend()
387
{
388
  $prepend = function ($item, array $array) {
389 2
    return array_merge([$item], $array);
390 2
  };
391 2
  $arguments = func_get_args();
392 2
  $curriedAny = curryN($prepend, 2);
393 2
  return call_user_func_array($curriedAny, $arguments);
394
}
395
396
/**
397
 * Returns a list of numbers from from (inclusive) to to (inclusive).
398
 * @param int|float|double $from
399
 * @param int|float|double $to
400
 * @return array|\Closure
401
 */
402
function range()
403
{
404 3
  $arguments = func_get_args();
405 3
  $curriedAny = curryN('range', 2);
406 3
  return call_user_func_array($curriedAny, $arguments);
407
}
408
409
/**
410
 * @param callable $accumulator
411
 * @param mixed $initialValue
412
 * @param array $array
413
 * @return mixed
414
 */
415
function reduce()
416
{
417
  $reduce = function (callable $accumulator, $initialValue, array $array) {
418 12
    return array_reduce($array, $accumulator, $initialValue);
419 12
  };
420 12
  $arguments = func_get_args();
421 12
  $curried = curryN($reduce, 3);
422 12
  return call_user_func_array($curried, $arguments);
423
}
424
425
/**
426
 * @param callable $predicate
427
 * @param array $array
428
 * @return array|\Closure
429
 */
430
function reject()
431
{
432
  $reject = function ($predicate, array $array) {
433 1
    return array_values(array_filter($array, compose(not(), $predicate)));
434 1
  };
435 1
  $arguments = func_get_args();
436 1
  $curried = curryN($reject, 2);
437 1
  return call_user_func_array($curried, $arguments);
438
}
439
440
/**
441
 * @param callable $predicate
442
 * @param array $array
443
 * @return array|\Closure
444
 */
445
function rejectPreserveKey()
446
{
447
  $reject = function ($predicate, array $array) {
448 1
    return array_filter($array, compose(not(), $predicate));
449 1
  };
450 1
  $arguments = func_get_args();
451 1
  $curried = curryN($reject, 2);
452 1
  return call_user_func_array($curried, $arguments);
453
}
454
455
/**
456
 * Number → Number → [a] → [a]
457
 * @param int $start
458
 * @param int $count
459
 * @param array $array
460
 * @return mixed
461
 */
462
function remove()
463
{
464
  $remove = function (int $start, int $count, array $array) {
465 1
    return array_merge(array_slice($array, 0, $start), array_slice($array, $start + $count));
466 1
  };
467 1
  $arguments = func_get_args();
468 1
  $curried = curryN($remove, 3);
469 1
  return call_user_func_array($curried, $arguments);
470
}
471
472
/**
473
 * @param mixed $item
474
 * @param int $count
475
 * @return array|\Closure
476
 */
477
function repeat()
478
{
479
  $repeat = function ($item, int $count) {
480 1
    return array_reduce(
481 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

481
      /** @scrutinizer ignore-type */ range(1, $count),
Loading history...
482
      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

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