22
33namespace Php \Pairs \Pairs ;
44
5+ use Closure ;
6+ use function is_callable ;
7+
58/**
69 * Creates a pair with two values
710 * @param mixed $a first value
811 * @param mixed $b second value
9- * @return callable pair
12+ * @return Closure pair
1013 * @example
1114 * $pair = cons(5, 'hello');
1215 * @example
1316 * $pair = cons(cons(1, null), 'world');
1417 */
15- function cons ($ a , $ b )
18+ function cons ($ a , $ b ): Closure
1619{
1720 return function ($ method ) use ($ a , $ b ) {
1821 switch ($ method ) {
@@ -28,59 +31,64 @@ function cons($a, $b)
2831
2932/**
3033 * Check if something is pair
31- * @param callable $pair
34+ * @param Closure $pair
3235 * @return boolean
3336 * @example
3437 * $pair = cons(5, 'hello');
3538 * isPair($pair); // true
3639 * isPair(5); // false
3740 */
38- function isPair ($ pair )
41+ function isPair (mixed $ pair ): bool
3942{
40- return is_callable ( $ pair) ;
43+ return $ pair instanceof Closure ;
4144}
4245
43- function checkPair ($ pair )
46+ /**
47+ * @param mixed $pair
48+ * @return void
49+ * @throws \Exception
50+ */
51+ function checkPair (mixed $ pair ): void
4452{
4553 if (!isPair ($ pair )) {
46- $ value = is_array ($ pair ) ? ' array ' : ( string ) $ pair ;
54+ $ value = gettype ($ pair );
4755 throw new \Exception ("Argument must be pair, but it was ' {$ value }' " );
4856 }
4957}
5058
5159/**
5260 * Get car (first element) from pair
53- * @param callable $pair
61+ * @param Closure $pair
5462 * @return mixed
5563 */
56- function car (callable $ pair )
64+ function car (Closure $ pair ): mixed
5765{
5866 checkPair ($ pair );
5967 return $ pair ("car " );
6068}
6169
6270/**
6371 * Get cdr (second element) from pair
64- * @param callable $pair
72+ * @param Closure $pair
6573 * @return mixed
6674 */
67- function cdr (callable $ pair )
75+ function cdr (Closure $ pair ): mixed
6876{
6977 checkPair ($ pair );
7078 return $ pair ("cdr " );
7179}
7280
7381/**
7482 * Convert pair to string (recursively)
75- * @param callable $pair
83+ * @param Closure $pair
7684 * @return string
7785 * @example
7886 * toString(cons('', 10)); // ('', 10)
7987 */
80- function toString ($ pair )
88+ function toString (mixed $ pair ): string
8189{
8290 checkPair ($ pair );
83- $ rec = function ($ p ) use (&$ rec ) {
91+ $ iter = function ($ p ) use (&$ iter ) {
8492 if (!isPair ($ p )) {
8593 if ($ p === null ) {
8694 return 'null ' ;
@@ -92,11 +100,11 @@ function toString($pair)
92100 return (string ) $ p ;
93101 }
94102
95- $ recLeft = $ rec (car ($ p ));
96- $ recRight = $ rec (cdr ($ p ));
103+ $ recLeft = $ iter (car ($ p ));
104+ $ recRight = $ iter (cdr ($ p ));
97105
98106 return "( {$ recLeft }, {$ recRight }) " ;
99107 };
100108
101- return $ rec ($ pair );
109+ return $ iter ($ pair );
102110}
0 commit comments