Coder Social home page Coder Social logo

composemixins's Introduction

ComposeMixins

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

Installation

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

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

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.

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.