diff --git a/composer.json b/composer.json index 4558879..4109d26 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,8 @@ "phpspec/phpspec": "^5.1.2 || ^6.1.1", "phpstan/phpstan": "^0.12.5", "phpstan/phpstan-strict-rules": "^0.12", - "scrutinizer/ocular": "^1.6" + "scrutinizer/ocular": "^1.6", + "vimeo/psalm": "^3.8" }, "config": { "sort-packages": true diff --git a/grumphp.yml.dist b/grumphp.yml.dist index 2159c87..5651950 100644 --- a/grumphp.yml.dist +++ b/grumphp.yml.dist @@ -4,6 +4,7 @@ imports: parameters: process_timeout: 600 extra_tasks: + psalm: ~ phpspec: verbose: true metadata: diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..9d2a538 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/src/Combinator/A.php b/src/Combinator/A.php index 31aed1a..b47120a 100644 --- a/src/Combinator/A.php +++ b/src/Combinator/A.php @@ -8,6 +8,9 @@ /** * Class A. + * + * @psalm-template XType + * @psalm-template ResultType */ final class A extends Combinator { @@ -24,6 +27,9 @@ final class A extends Combinator /** * A constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param XType $x + * * @param callable $f * @param mixed $x */ @@ -34,6 +40,8 @@ public function __construct(callable $f, $x) } /** + * @psalm-return ResultType + * * @return mixed */ public function __invoke() diff --git a/src/Combinator/B.php b/src/Combinator/B.php index 22cf87e..1545a3e 100644 --- a/src/Combinator/B.php +++ b/src/Combinator/B.php @@ -8,6 +8,10 @@ /** * Class B. + * + * @psalm-template GOutput + * @psalm-template XType + * @psalm-template ResultType */ final class B extends Combinator { @@ -29,6 +33,10 @@ final class B extends Combinator /** * B constructor. * + * @psalm-param callable(GOutput) : ResultType $f + * @psalm-param callable(XType) : GOutput $g + * @psalm-param XType $x + * * @param callable $f * @param callable $g * @param mixed $x @@ -41,7 +49,7 @@ public function __construct(callable $f, callable $g, $x) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/C.php b/src/Combinator/C.php index 2a2aa92..b6f1c94 100644 --- a/src/Combinator/C.php +++ b/src/Combinator/C.php @@ -8,6 +8,9 @@ /** * Class C. + * + * @psalm-template XType + * @psalm-template ResultType */ final class C extends Combinator { @@ -29,6 +32,10 @@ final class C extends Combinator /** * C constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param XType $x + * @psalm-param XType $y + * * @param callable $f * @param mixed $x * @param mixed $y @@ -41,7 +48,7 @@ public function __construct(callable $f, $x, $y) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/D.php b/src/Combinator/D.php index 7deaf7f..2b029cb 100644 --- a/src/Combinator/D.php +++ b/src/Combinator/D.php @@ -8,6 +8,9 @@ /** * Class D. + * + * @psalm-template XType + * @psalm-template ResultType */ final class D extends Combinator { @@ -34,6 +37,11 @@ final class D extends Combinator /** * D constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param callable(XType) : ResultType $g + * @psalm-param XType $x + * @psalm-param XType $y + * * @param callable $f * @param callable $g * @param mixed $x @@ -48,7 +56,7 @@ public function __construct(callable $f, $x, callable $g, $y) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/E.php b/src/Combinator/E.php index fa5ec11..a9ea4f7 100644 --- a/src/Combinator/E.php +++ b/src/Combinator/E.php @@ -8,6 +8,9 @@ /** * Class E. + * + * @psalm-template XType + * @psalm-template ResultType */ final class E extends Combinator { @@ -39,6 +42,12 @@ final class E extends Combinator /** * E constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param XType $x + * @psalm-param callable(XType) : ResultType $g + * @psalm-param XType $y + * @psalm-param XType $z + * * @param callable $f * @param mixed $x * @param callable $g @@ -55,7 +64,7 @@ public function __construct(callable $f, $x, callable $g, $y, $z) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/F.php b/src/Combinator/F.php index 912ae31..a41fbd1 100644 --- a/src/Combinator/F.php +++ b/src/Combinator/F.php @@ -8,6 +8,9 @@ /** * Class F. + * + * @psalm-template XType + * @psalm-template ResultType */ final class F extends Combinator { @@ -22,13 +25,17 @@ final class F extends Combinator private $x; /** - * @var callable + * @var mixed */ private $y; /** * F constructor. * + * @psalm-param XType $x + * @psalm-param XType $y + * @psalm-param callable(XType) : ResultType $f + * * @param mixed $x * @param mixed $y * @param callable $f @@ -41,7 +48,7 @@ public function __construct($x, $y, callable $f) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/G.php b/src/Combinator/G.php index 1b2a0cf..06b8ab3 100644 --- a/src/Combinator/G.php +++ b/src/Combinator/G.php @@ -8,6 +8,9 @@ /** * Class G. + * + * @psalm-template XType + * @psalm-template ResultType */ final class G extends Combinator { @@ -27,13 +30,18 @@ final class G extends Combinator private $x; /** - * @var callable + * @var mixed */ private $y; /** * G constructor. * + * @psalm-param callable(XType) : callable $f + * @psalm-param callable(XType) : ResultType $g + * @psalm-param XType $x + * @psalm-param XType $y + * * @param callable $f * @param callable $g * @param mixed $x @@ -48,7 +56,7 @@ public function __construct(callable $f, callable $g, $x, $y) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/H.php b/src/Combinator/H.php index 04370e8..2063d7b 100644 --- a/src/Combinator/H.php +++ b/src/Combinator/H.php @@ -8,6 +8,9 @@ /** * Class H. + * + * @psalm-template XType + * @psalm-template ResultType */ final class H extends Combinator { @@ -17,7 +20,7 @@ final class H extends Combinator private $f; /** - * @var callable + * @var mixed */ private $x; @@ -29,6 +32,10 @@ final class H extends Combinator /** * H constructor. * + * @psalm-param callable(XType) : callable $f + * @psalm-param XType $x + * @psalm-param XType $y + * * @param callable $f * @param mixed $x * @param mixed $y @@ -41,7 +48,7 @@ public function __construct(callable $f, $x, $y) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/I.php b/src/Combinator/I.php index f551bb6..e571710 100644 --- a/src/Combinator/I.php +++ b/src/Combinator/I.php @@ -8,6 +8,9 @@ /** * Class I. + * + * @psalm-template XType + * @psalm-template ResultType */ final class I extends Combinator { @@ -19,6 +22,8 @@ final class I extends Combinator /** * I constructor. * + * @psalm-param XType $x + * * @param mixed $x */ public function __construct($x) @@ -27,7 +32,7 @@ public function __construct($x) } /** - * @return mixed + * @psalm-return XType */ public function __invoke() { diff --git a/src/Combinator/J.php b/src/Combinator/J.php index 8dfca5a..fb23f19 100644 --- a/src/Combinator/J.php +++ b/src/Combinator/J.php @@ -8,6 +8,9 @@ /** * Class J. + * + * @psalm-template XType + * @psalm-template ResultType */ final class J extends Combinator { @@ -17,7 +20,7 @@ final class J extends Combinator private $f; /** - * @var callable + * @var mixed */ private $x; @@ -34,6 +37,11 @@ final class J extends Combinator /** * J constructor. * + * @psalm-param callable(XType) : callable $f + * @psalm-param XType $x + * @psalm-param XType $y + * @psalm-param XType $z + * * @param callable $f * @param mixed $x * @param mixed $y @@ -48,7 +56,7 @@ public function __construct(callable $f, $x, $y, $z) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/K.php b/src/Combinator/K.php index a14af13..6f067cf 100644 --- a/src/Combinator/K.php +++ b/src/Combinator/K.php @@ -8,6 +8,9 @@ /** * Class K. + * + * @psalm-template XType + * @psalm-template ResultType */ final class K extends Combinator { @@ -24,6 +27,9 @@ final class K extends Combinator /** * K constructor. * + * @psalm-param XType $x + * @psalm-param XType $y + * * @param mixed $x * @param mixed $y */ @@ -34,7 +40,7 @@ public function __construct($x, $y) } /** - * @return mixed + * @psalm-return XType */ public function __invoke() { diff --git a/src/Combinator/L.php b/src/Combinator/L.php index f1f40fc..a2d42da 100644 --- a/src/Combinator/L.php +++ b/src/Combinator/L.php @@ -8,6 +8,8 @@ /** * Class L. + * + * @psalm-template ResultType */ final class L extends Combinator { @@ -34,6 +36,8 @@ public function __construct(callable $f, callable $g) } /** + * @psalm-return ResultType + * * @return mixed */ public function __invoke() diff --git a/src/Combinator/M.php b/src/Combinator/M.php index 23b6bf1..ff6cbf4 100644 --- a/src/Combinator/M.php +++ b/src/Combinator/M.php @@ -8,6 +8,8 @@ /** * Class M. + * + * @psalm-template ResultType */ final class M extends Combinator { @@ -19,6 +21,8 @@ final class M extends Combinator /** * M constructor. * + * @psalm-param callable $f + * * @param callable $f */ public function __construct(callable $f) @@ -27,7 +31,7 @@ public function __construct(callable $f) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/O.php b/src/Combinator/O.php index 84146f4..6d6bc1b 100644 --- a/src/Combinator/O.php +++ b/src/Combinator/O.php @@ -8,6 +8,8 @@ /** * Class O. + * + * @psalm-template ResultType */ final class O extends Combinator { @@ -34,7 +36,7 @@ public function __construct(callable $f, callable $g) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/Q.php b/src/Combinator/Q.php index 5265114..4eb0f66 100644 --- a/src/Combinator/Q.php +++ b/src/Combinator/Q.php @@ -8,6 +8,9 @@ /** * Class Q. + * + * @psalm-template XType + * @psalm-template ResultType */ final class Q extends Combinator { @@ -29,6 +32,10 @@ final class Q extends Combinator /** * Q constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param callable(XType) : ResultType $g + * @psalm-param XType $x + * * @param callable $f * @param callable $g * @param mixed $x @@ -41,7 +48,7 @@ public function __construct(callable $f, callable $g, $x) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/R.php b/src/Combinator/R.php index f776d62..0bee21a 100644 --- a/src/Combinator/R.php +++ b/src/Combinator/R.php @@ -8,6 +8,9 @@ /** * Class R. + * + * @psalm-template XType + * @psalm-template ResultType */ final class R extends Combinator { @@ -29,6 +32,10 @@ final class R extends Combinator /** * R constructor. * + * @psalm-param XType $x + * @psalm-param callable(XType) : callable $f + * @psalm-param XType $y + * * @param mixed $x * @param callable $f * @param mixed $y @@ -41,7 +48,7 @@ public function __construct($x, callable $f, $y) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/S.php b/src/Combinator/S.php index 2f5f15d..3f9e42a 100644 --- a/src/Combinator/S.php +++ b/src/Combinator/S.php @@ -8,6 +8,9 @@ /** * Class S. + * + * @psalm-template XType + * @psalm-template ResultType */ final class S extends Combinator { @@ -29,6 +32,10 @@ final class S extends Combinator /** * S constructor. * + * @psalm-param callable(XType) : callable $f + * @psalm-param callable(XType) : ResultType $g + * @psalm-param XType $x + * * @param callable $f * @param callable $g * @param mixed $x @@ -41,7 +48,7 @@ public function __construct(callable $f, callable $g, $x) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/T.php b/src/Combinator/T.php index 0545be1..97cbd38 100644 --- a/src/Combinator/T.php +++ b/src/Combinator/T.php @@ -8,6 +8,9 @@ /** * Class T. + * + * @psalm-template XType + * @psalm-template ResultType */ final class T extends Combinator { @@ -24,6 +27,9 @@ final class T extends Combinator /** * T constructor. * + * @psalm-param callable(XType) : ResultType $f + * @psalm-param XType $x + * * @param callable $f * @param mixed $x */ @@ -34,7 +40,7 @@ public function __construct($x, callable $f) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/U.php b/src/Combinator/U.php index 5d2e7c3..5a52574 100644 --- a/src/Combinator/U.php +++ b/src/Combinator/U.php @@ -8,6 +8,8 @@ /** * Class U. + * + * @psalm-template ResultType */ final class U extends Combinator { @@ -24,6 +26,9 @@ final class U extends Combinator /** * U constructor. * + * @psalm-param callable $f + * @psalm-param callable $g + * * @param callable $f * @param callable $g */ @@ -34,7 +39,7 @@ public function __construct(callable $f, callable $g) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/V.php b/src/Combinator/V.php index 5ad8b32..8377c91 100644 --- a/src/Combinator/V.php +++ b/src/Combinator/V.php @@ -8,6 +8,9 @@ /** * Class V. + * + * @psalm-template XType + * @psalm-template ResultType */ final class V extends Combinator { @@ -29,6 +32,10 @@ final class V extends Combinator /** * V constructor. * + * @psalm-param XType $x + * @psalm-param XType $y + * @psalm-param callable(XType) : callable $f + * * @param mixed $x * @param mixed $y * @param callable $f @@ -41,7 +48,7 @@ public function __construct($x, $y, callable $f) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/W.php b/src/Combinator/W.php index 0334737..fccb43e 100644 --- a/src/Combinator/W.php +++ b/src/Combinator/W.php @@ -8,6 +8,9 @@ /** * Class W. + * + * @psalm-template XType + * @psalm-template ResultType */ final class W extends Combinator { @@ -24,6 +27,9 @@ final class W extends Combinator /** * W constructor. * + * @psalm-param callable(XType) : callable $f + * @psalm-param XType $x + * * @param callable $f * @param mixed $x */ @@ -34,7 +40,7 @@ public function __construct(callable $f, $x) } /** - * @return mixed + * @psalm-return ResultType */ public function __invoke() { diff --git a/src/Combinator/Y.php b/src/Combinator/Y.php index 9ff3d78..7aeb6f1 100644 --- a/src/Combinator/Y.php +++ b/src/Combinator/Y.php @@ -4,10 +4,13 @@ namespace loophp\combinator\Combinator; +use Closure; use loophp\combinator\Combinator; /** * Class Y. + * + * @psalm-template ResultType */ final class Y extends Combinator { @@ -19,6 +22,8 @@ final class Y extends Combinator /** * Y constructor. * + * @psalm-param callable $f + * * @param callable $f */ public function __construct(callable $f) @@ -27,14 +32,26 @@ public function __construct(callable $f) } /** - * @return mixed + * @psalm-return Closure(Closure(callable): mixed): mixed */ public function __invoke() { $callable = $this->f; - $f = static function (callable $f) use ($callable): callable { + /** + * @psalm-suppress MissingClosureReturnType + * + * @param callable $f + * + * @return mixed + */ + $f = static function (callable $f) use ($callable) { return $callable( + /** + * @psalm-suppress MissingClosureParamType + * + * @param array $arguments + */ static function (...$arguments) use ($f) { return $f($f)(...$arguments); }