nunomaduro / curryable
An elegant and simple curry(f) implementation in PHP.
Fund package maintenance!
nunomaduro
Patreon
www.paypal.com/paypalme/enunomaduro
Installs: 1 858
Dependents: 0
Suggesters: 0
Security: 0
Stars: 176
Watchers: 7
Forks: 3
Open Issues: 0
Requires
- php: ^7.2 || ^8.0
Requires (Dev)
- pestphp/pest: ^0.3
- phpstan/phpstan: ^0.12
This package is auto-updated.
Last update: 2024-10-22 01:10:35 UTC
README
About Curryable
This package is under development, please don't use it on production and wait for the stable release!
Curryable was created by, and is maintained by Nuno Maduro, and is an elegant and simple curry(f) implementation in PHP. Currying is an advanced technique of working with functions. It wraps the given expressions and arguments into a new function that resolves a value.
Installation & Usage
Requires PHP 7.2+
Create your package using Composer:
composer require nunomaduro/curryable
This helper usage is best described through example in the Laravel framework:
On routing
Route::get('/', curry('view', 'welcome')); // Instead of Route::get('/', function () { return view('welcome'); });
Route::get('user/{id}', curry(User::class)->find()); // Or with Eloquent macro Route::get('user/{id}', User::curry()->find()); // Instead of Route::get('user/{id}', function ($id) { return User::find($id); });
On macros
Renaming the lower
method to toLower
:
Str::macro('toLower', curry()->lower()); // or with the global `strtolower` Str::macro('toLower', curry('strtolower')); // Instead of Str::macro('toLower', function ($value) { return Str::lower($value); });
On collections
Using the global strtoupper
:
$collection = collect(['nuno'])->map(curry('strtoupper')); // ['NUNO'] // Instead of $collection = collect(['nuno'])->map(function ($name) { return strtoupper($name); });
Here is another example using the each
:
// Calls User::create($user) foreach user collect($users)->each(User::curry()->create()); // Instead of $collection = collect($users)->map(function ($user) { return User::create($user); });
Dispatching jobs:
dispatch(curry(Artisan::class)->call('horizon:terminate')); // Instead of dispatch(function () { Artisan::call('horizon:terminate'); });
Curry on class instance methods
With global helper:
$closure = curry($instance)->instanceMethodName(); $closure($first, $second); $closure = curry($instance)->instanceMethodName($first); $closure($second); // just need for the second argument $closure = curry($instance)->instanceMethodName($first, $second); $closure(); // no need for arguments
With trait NunoMaduro\Curryable\Curryable
:
$closure = $instance->curry()->instanceMethodName(); $closure($first, $second); $closure = $instance->curry()->instanceMethodName($first); $closure($second); // just need for the second argument $closure = $instance->curry()->instanceMethodName($first, $second); $closure(); // no need for arguments
Curry on class static methods
// Curry on instance methods $closure = curry(Instance::class)->staticMethodName(); $closure($first, $second); $closure = curry(Instance::class)->staticMethodName($first); $closure($second); // just need for the second argument $closure = curry(Instance::class)->staticMethodName($first, $second); $closure(); // no need for arguments
Curry on functions
// Curry on instance methods $closure = curry('function_name'); $closure($first, $second); $closure = curry('function_name', $first); $closure($second); // just need for the second argument $closure = curry('function_name', $first, $second); $closure(); // no need for arguments
Contributing
Thank you for considering to contribute to Curryable. All the contribution guidelines are mentioned here.
You can have a look at the CHANGELOG for constant updates & detailed information about the changes. You can also follow the twitter account for latest announcements or just come say hi!: @enunomaduro
Support the development
Do you like this project? Support it by donating
License
curryable is an open-sourced software licensed under the MIT license.