Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/reasno/composemixins
ComposeMixins is a tiny but extendable PHP library for function composition.
https://github.com/reasno/composemixins
compose function-composition functional-programming php
Last synced: about 2 months ago
JSON representation
ComposeMixins is a tiny but extendable PHP library for function composition.
- Host: GitHub
- URL: https://github.com/reasno/composemixins
- Owner: Reasno
- Created: 2018-01-23T03:26:40.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2018-06-15T15:17:47.000Z (over 6 years ago)
- Last Synced: 2024-04-16T13:04:00.843Z (9 months ago)
- Topics: compose, function-composition, functional-programming, php
- Language: PHP
- Homepage:
- Size: 13.7 KB
- Stars: 10
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ComposeMixins
ComposeMixins is a tiny but extendable PHP library for function composition.## Installation
```bash
# in your project root
composer require reasno/compose-mixins
```## Examples
```php
use function Reasno\Helpers\composeMixins;
use Reasno\Helpers\Recipe;$c = composeMixins(new Recipe('pipe'), /* callable */ $a, /* callable */ $b);
$result = $c($input); //Use the composed function```
$c becomes a composition of function $a and function $b. You can verify it with the following snippet.
```php
$result1 = $c($input);
$result2 = $a($b($input));var_dump($result1 === $result2); //true
```## API
```php
function composeMixins(Recipe $recipe, callable ...$mixins)
```## Recipes
This library comes with a few (most frequently used) built in recipes. These recipes define how functions are composed together.* pipe: h(x) = g(f(x))
* map: h(list) = array_map(g, (array_map(f, list)))
* all: returns true if all functions (eg. f(x), g(x)...) return true.
* any: returns true if any function returns true.To use any recipe, create new instance with their names passed into constructor.
```php
new Recipe('map');
```You can create new recipes on the fly. Just pass in a closure.
```php
/* use a different handler each time the composed function is called */
$r = Recipe::fromCallable(function(...$fns){
static $i = 0;
return function($input) use (&$i, $fns){
try{
return $fns[$i++]($input);
} catch( Error $e ){
return null;
}};
});
```You can define your own RecipeHandlers in your own code, and pass it to the recipe constructor.
```php
Class MyRecipeHandler{
//...
}
$CustomRecipe = new Recipe('fancy', ['handler' => 'MyRecipeHandler']);
```
Please take a look at [RecipeHandler.php](https://github.com/Reasno/ComposeMixins/blob/master/src/RecipeHandler.php) in this library to learn how to write your own handlers.## Caveat
* Functions composed with ```map``` and ```collapse``` recipes also accept ```Traversable``` as input.
* For ```all``` and ```any``` recipes, all functions are always evaluated regardless of their return values.## Testing
PHPUnit is overkill for this project. To do a simple test, execute ```php tests/composeMixinsTest.php``` and see if all assertions pass.