Completed
Pull Request — master (#5)
by Siwapun
02:42
created

partial()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
namespace Aerophant\Ramda;
3
4
/**
5
 * @param mixed $data
6
 * @return \Closure
7
 */
8
function always()
9
{
10
  $always = function ($data) {
11
    return function () use ($data) {
12
      return $data;
13
    };
14
  };
15
  $arguments = func_get_args();
16
  $curried = curryN($always, 1);
17
  return call_user_func_array($curried, $arguments);
18
}
19
20
/**
21
 * @return callable
22
 * @throws \Exception
23
 */
24
function compose()
25
{
26
  $arguments = array_reverse(func_get_args());
27
  return call_user_func_array('Aerophant\Ramda\pipe', $arguments);
28
}
29
30
/**
31
 * @param string $class
32
 * @return \Closure
33
 */
34
function construct()
35
{
36
  $construct = function ($class) {
37
    return function () use ($class) {
38
      return new $class();
39
    };
40
  };
41
  $arguments = func_get_args();
42
  $curried = curryN($construct, 1);
43
  return call_user_func_array($curried, $arguments);
44
}
45
46
function curryN(callable $fn, int $numberOfArguments)
47
{
48
  return function () use ($fn, $numberOfArguments) {
49
    $arguments = func_get_args();
50
    $length = count($arguments);
51
    if ($length > $numberOfArguments) {
52
      throw new \InvalidArgumentException(
53
        "Number of passed($length) parameters is greater than expected($numberOfArguments)"
54
      );
55
    }
56
    // NO CURRY
57
    if ($length == $numberOfArguments) {
58
      return call_user_func_array($fn, $arguments);
59
    }
60
    // AUTO CURRY
61
    $curriedFn = function () use ($fn, $arguments) {
62
      $curriedArguments = func_get_args();
63
      return call_user_func_array($fn, array_merge($arguments, $curriedArguments));
64
    };
65
    return curryN($curriedFn, $numberOfArguments - $length);
66
  };
67
}
68
69
/**
70
 * ((a, b, c, …, n) → x) → [a, b, c, …] → ((d, e, f, …, n) → x)
71
 * @param callable $fn
72
 * @param array $args
73
 * @return \Closure
74
 */
75
function partial(callable $fn, array $args)
76
{
77
  return function () use ($fn, $args) {
78
    $arguments = func_get_args();
79
    return call_user_func_array($fn, array_merge($args, $arguments));
80
  };
81
}
82
83
/**
84
 * ((a, b, c, …, n) → x) → [d, e, f, …, n] → ((a, b, c, …) → x)
85
 * @param callable $fn
86
 * @param array $args
87
 * @return \Closure
88
 */
89
function partialRight(callable $fn, array $args)
90
{
91
  return function () use ($fn, $args) {
92
    $arguments = func_get_args();
93
    return call_user_func_array($fn, array_merge($arguments, $args));
94
  };
95
}
96
97
/**
98
 * @return callable
99
 * @throws \Exception
100
 */
101
function pipe()
102
{
103
  $arguments = func_get_args();
104
  $length = count($arguments);
105
  if ($length === 0) {
106
    throw new \Exception("pipe requires at least one argument");
107
  }
108
  return function () use ($arguments) {
109
    $internalArguments = func_get_args();
110
    $initialValue = call_user_func_array($arguments[0], $internalArguments);
111
    $accumulator = function ($acc, $it) {
112
      return call_user_func_array($it, [$acc]);
113
    };
114
    return array_reduce(drop(0, $arguments), $accumulator, $initialValue);
115
  };
116
}
117