PHPackages                             reasno/compose-mixins - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. reasno/compose-mixins

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

reasno/compose-mixins
=====================

Customizable function composition for PHP.

0.1.1(8y ago)10111MITPHPPHP &gt;=5.6

Since Jan 23Pushed 7y ago1 watchersCompare

[ Source](https://github.com/Reasno/ComposeMixins)[ Packagist](https://packagist.org/packages/reasno/compose-mixins)[ RSS](/packages/reasno-compose-mixins/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependenciesVersions (7)Used By (0)

ComposeMixins
=============

[](#composemixins)

ComposeMixins is a tiny but extendable PHP library for function composition.

Installation
------------

[](#installation)

```
# in your project root
composer require reasno/compose-mixins
```

Examples
--------

[](#examples)

```
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.

```
$result1 = $c($input);
$result2 = $a($b($input));

var_dump($result1 === $result2); //true
```

API
---

[](#api)

```
function composeMixins(Recipe $recipe, callable ...$mixins)
```

Recipes
-------

[](#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.

```
new Recipe('map');
```

You can create new recipes on the fly. Just pass in a closure.

```
/* 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.

```
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
------

[](#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
-------

[](#testing)

PHPUnit is overkill for this project. To do a simple test, execute `php tests/composeMixinsTest.php` and see if all assertions pass.

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity12

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 96.6% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

6

Last Release

3028d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5f7af73177d27773a882385657d18105ac6dbe5eddf81ff883495bf4edd70f14?d=identicon)[Reasno](/maintainers/Reasno)

---

Top Contributors

[![Reasno](https://avatars.githubusercontent.com/u/3881629?v=4)](https://github.com/Reasno "Reasno (28 commits)")[![HuijiFE-bot](https://avatars.githubusercontent.com/u/34469554?v=4)](https://github.com/HuijiFE-bot "HuijiFE-bot (1 commits)")

---

Tags

composefunction-compositionfunctional-programmingphp

### Embed Badge

![Health badge](/badges/reasno-compose-mixins/health.svg)

```
[![Health](https://phpackages.com/badges/reasno-compose-mixins/health.svg)](https://phpackages.com/packages/reasno-compose-mixins)
```

###  Alternatives

[phpcr/phpcr-migrations

Migrations for PHPCR

421.4M2](/packages/phpcr-phpcr-migrations)[pattern-lab/edition-drupal-standard

Standard Edition of Pattern Lab for Drupal.

12419.1k](/packages/pattern-lab-edition-drupal-standard)[graphite-graph/graphite-graph

Graphite graph DSL

152.8k](/packages/graphite-graph-graphite-graph)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
