Skip to content

Commit

Permalink
Issue #1: Add PSALM type declaration.
Browse files Browse the repository at this point in the history
  • Loading branch information
drupol committed Jan 20, 2020
1 parent c83ab43 commit 2c74b3c
Show file tree
Hide file tree
Showing 51 changed files with 485 additions and 214 deletions.
5 changes: 1 addition & 4 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@

root = true

[*.{php,inc,module}]
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4

[*.{json,json.dist,yml,yml.dist}]
indent_size = 4
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions grumphp.yml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ imports:
parameters:
process_timeout: 600
extra_tasks:
psalm: ~
phpspec:
verbose: true
metadata:
Expand Down
55 changes: 55 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?xml version="1.0"?>
<psalm
totallyTyped="false"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
>
<projectFiles>
<directory name="src" />
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>

<issueHandlers>
<LessSpecificReturnType errorLevel="info" />

<!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->

<DeprecatedMethod errorLevel="info" />
<DeprecatedProperty errorLevel="info" />
<DeprecatedClass errorLevel="info" />
<DeprecatedConstant errorLevel="info" />
<DeprecatedFunction errorLevel="info" />
<DeprecatedInterface errorLevel="info" />
<DeprecatedTrait errorLevel="info" />

<InternalMethod errorLevel="info" />
<InternalProperty errorLevel="info" />
<InternalClass errorLevel="info" />

<MissingClosureReturnType errorLevel="info" />
<MissingReturnType errorLevel="info" />
<MissingPropertyType errorLevel="info" />
<InvalidDocblock errorLevel="info" />
<MisplacedRequiredParam errorLevel="info" />

<PropertyNotSetInConstructor errorLevel="info" />
<MissingConstructor errorLevel="info" />
<MissingClosureParamType errorLevel="info" />
<MissingParamType errorLevel="info" />

<RedundantCondition errorLevel="info" />

<DocblockTypeContradiction errorLevel="info" />
<RedundantConditionGivenDocblockType errorLevel="info" />

<UnresolvableInclude errorLevel="info" />

<RawObjectIteration errorLevel="info" />

<InvalidStringClass errorLevel="info" />
</issueHandlers>
</psalm>
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/ASpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('FOO');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/BSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(17);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/CSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('ba');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/DSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('f(x)(g(y))');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/ESpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn((float) 10);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/FSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn((float) 9);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/GSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn((float) 9);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/HSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(17);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/ISpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('foo');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/JSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(6);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/KSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('bar');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/LSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(36);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/MSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('argnull');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/OSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('g(f(g()))');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/PsiSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(68);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/QSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('g(f(a))');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/RSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('f(y)(x)');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/SSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn((float) 21);
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/TSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('FOO');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/USpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('g(f(f)(g))');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/VSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn('f(x)(y)');
}
}
2 changes: 1 addition & 1 deletion spec/loophp/combinator/Combinator/WSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function it_is_initializable()
->shouldReturnAnInstanceOf(Closure::class);

$this
->closure()(...$arguments)
->closure()(...$arguments)()
->shouldReturn(11);
}
}
5 changes: 2 additions & 3 deletions spec/loophp/combinator/Combinator/YSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ public function it_is_initializable()
->closure()
->shouldReturnAnInstanceOf(Closure::class);

$closure = $this
->closure();
$closure = $this->closure();

$closure($f)(6)
$closure($f)()(6)
->shouldReturn(720);
}
}
23 changes: 17 additions & 6 deletions src/Combinator/A.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@

namespace loophp\combinator\Combinator;

use Closure;
use loophp\combinator\Combinator;

/**
* Class A.
*
* @psalm-template XType
* @psalm-template ResultType
*/
final class A extends Combinator
{
/**
* @var callable
* @var Closure
*/
private $f;

Expand All @@ -24,16 +28,21 @@ final class A extends Combinator
/**
* A constructor.
*
* @psalm-param callable(XType) : ResultType $f
* @psalm-param XType $x
*
* @param callable $f
* @param mixed $x
*/
public function __construct(callable $f, $x)
{
$this->f = $f;
$this->f = Closure::fromCallable($f);
$this->x = $x;
}

/**
* @psalm-return ResultType
*
* @return mixed
*/
public function __invoke()
Expand All @@ -42,12 +51,14 @@ public function __invoke()
}

/**
* @return callable
* @psalm-return \Closure(callable, mixed) : mixed
*
* @return Closure
*/
public static function closure(): callable
public static function closure(): Closure
{
return static function (callable $f, $x) {
return (new self($f, $x))();
return static function (callable $f, $x): Closure {
return Closure::fromCallable([(new self($f, $x)), '__invoke']);
};
}
}
Loading

0 comments on commit 2c74b3c

Please sign in to comment.