Skip to content

Commit

Permalink
More example code in readme
Browse files Browse the repository at this point in the history
  • Loading branch information
DaveRandom committed Apr 1, 2017
1 parent 95e987f commit 1b99497
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions README.md
Expand Up @@ -15,25 +15,42 @@ Validates callback signatures against a prototype.
// Create a prototype function (can be any callable)
$prototype = function (A $a, B $b, $c): ?string {};

// Create a type from the prototype
$type = CallbackType::createFromCallable($prototype);

// Validate that callables match the prototype
$tests = [
$prototype, // true
function (A $a, B $b, $c) {}, // false - return type does not match
function ($a, $b, $c): ?string {}, // true - arguments are contravariant
function (A $a, B $b): ?string {}, // true - extra args don't cause errors
function (A $a, B $b, $c, $d): ?string {}, // false - Insufficient args cause an error
function (C $a, B $b, $c): ?string {}, // true if C is a supertype of A, false otherwise
function (A $a, B $b, $c): string {}, // true, return types are covariant
function (SuperTypeOfA $a, B $b, $c): ?string {}, // true
function (A $a, B $b, $c): string {}, // true - return types are covariant
];

foreach ($tests as $test) {
if ($type->isSatisfiedBy($test)) {
echo "pass\n";
} else {
// CallbackType implements __toString() for easy inspections
echo CallbackType::createFromCallable($test) . " does not satisfy $type\n";
// Create a type from a prototype
$type = CallbackType::createFromCallable($prototype);

run_tests($type, $tests);

// ...or create a type by hand for more granular control over variance rules
$type = new CallbackType(
new ReturnType(BuiltInTypes::STRING, ReturnType::NULLABLE | ReturnType::COVARIANT),
new ParameterType('a', A::class),
new ParameterType('b', B::class),
new ParameterType('c')
);

run_tests($type, $tests);

function run_tests(CallbackType $type, array $tests)
{
foreach ($tests as $test) {
if ($type->isSatisfiedBy($test)) {
echo "pass\n";
} else {
// CallbackType implements __toString() for easy inspections
echo CallbackType::createFromCallable($test) . " does not satisfy {$type}\n";
}
}
}
```
Expand Down

0 comments on commit 1b99497

Please sign in to comment.