Skip to content

Commit

Permalink
Merge pull request #9141 from bitwise-operators/9132-document-pure-ca…
Browse files Browse the repository at this point in the history
…llables
  • Loading branch information
weirdan committed Jan 19, 2023
2 parents 5d6dff9 + a1ad738 commit d32aca3
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions docs/annotating_code/type_syntax/callable_types.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,34 @@ function delayedAdd(int $x, int $y) : Closure {
$adder = delayedAdd(3, 4);
echo $adder(true);
```

## Pure callables

For situations where the `callable` needs to be pure or immutable, the subtypes `pure-callable` and `pure-Closure` are also available.

This can be useful when the `callable` is used in a function marked with `@psalm-pure` or `@psalm-mutation-free`, for example:

```php
<?php
/** @psalm-immutable */
class intList {
/** @param list<int> $items */
public function __construct(private array $items) {}

/**
* @param pure-callable(int, int): int $callback
* @psalm-mutation-free
*/
public function walk(callable $callback): int {
return array_reduce($this->items, $callback, 0);
}
}

$list = new intList([1,2,3]);

// This is ok, as the callable is pure
echo $list->walk(fn (int $c, int $v): int => $c + $v);

// This will cause an InvalidArgument error, as the closure calls an impure function
echo $list->walk(fn (int $c, int $v): int => $c + random_int(1, $v));
```

0 comments on commit d32aca3

Please sign in to comment.