## Getting Started
### Minimal Steps
1. **Verify Deprecation**: Confirm this package is deprecated and replaced by [`react/partial`](https://github.com/reactphp/partial). Do **not** use `react/curry` in new projects.
2. **Installation (Legacy Only)**:
```bash
composer require react/curry
use React\Curry\Curry;
// Partial application (not currying)
$add = function ($a, $b) { return $a + $b; };
$addFive = Curry::apply($add, 5);
$result = $addFive(3); // Returns 8
Closure::bind()) for simpler cases.use React\Curry\Curry;
Event::listen('user.registered', Curry::apply(
[$notifier, 'sendEmail'],
'welcome'
));
$middleware = Curry::apply(
\App\Http\Middleware\Authenticate::class,
['guard' => 'admin']
);
$this->app->bind('partial.add', function () {
return Curry::apply(fn($a, $b) => $a + $b, 10);
});
$processOrder = Curry::apply(
[OrderProcessor::class, 'handle'],
$orderId
);
dispatch($processOrder);
f(a)(b)), not multi-step currying (e.g., f(a)(b)(c)). Use react/partial for the latter.User::observe(new class {
public function saved(User $user) {
$log = Curry::apply([$this, 'logAction'], 'user_saved');
$log($user->id);
}
});
$command = new class extends Command {
protected $signature = 'user:promote {id}';
public function handle() {
$promote = Curry::apply([User::class, 'promote'], $this->argument('id'));
$promote();
}
};
$partial = Curry::apply([User::class, 'find'], 1);
$user = $partial(); // Returns User or null
$getUser = Curry::apply([User::class, 'find'], 1);
$user = $getUser(); // IDE knows return type is User|null
// Instead of:
$partialLogger = Curry::apply([Logger::class, 'log'], 'error');
// Use:
$this->app->bind('logger', function () {
return new Logger();
});
Deprecation Warning
react/partial immediately.// Old (react/curry)
$partial = Curry::apply($func, $arg);
// New (react/partial)
$partial = \React\Partial\partial($func, $arg);
Closure Scope Issues
$this context. Use static methods or bindTo:
// Wrong (loses $this)
$partial = Curry::apply([$this, 'method'], $arg);
// Correct (binds $this)
$partial = Curry::apply($this->method(...), $arg);
Performance Overhead
static $cachedPartial = null;
if (!$cachedPartial) {
$cachedPartial = Curry::apply($expensiveFunc, $arg);
}
Argument Order Matters
$concat = Curry::apply('str_concat', 'Prefix_');
$result = $concat('suffix'); // "Prefix_suffix"
Laravel-Specific Issues
Model::first() in ReactPHP event loops).$partial = Curry::apply($func, $arg);
var_dump($partial); // Should show "closure" with pre-bound args.
try {
$result = $partial();
} catch (\Throwable $e) {
Log::error("Partial failed: " . $e->getMessage());
}
// Bad (blocks event loop)
$partial = Curry::apply([DB::class, 'select'], 'users');
// Good (async)
$partial = Curry::apply([DB::class, 'selectOneFor'], $userId);
Leverage react/partial Features
use React\Partial\partial;
$add = partial(fn($a, $b, $c) => $a + $b + $c, 1, 2);
$result = $add(3); // 6
Laravel Service Provider Helpers
$this->app->singleton('partial', function () {
return new class {
public function apply($func, ...$args) {
return Curry::apply($func, ...$args);
}
};
});
Testing Partials
$partial = Curry::apply([$service, 'method'], $arg);
$this->partialMock = $this->partialMock->method('__invoke')
->willReturn($expected);
Avoid Overuse
// Instead of:
$partial = Curry::apply([User::class, 'find'], 1);
// Use:
$user = User::find(1);
Document Partial Usage
/**
* @var \Closure(int): User|null
*/
$getUser = Curry::apply([User::class, 'find'], 1);
Custom Partial Logic
Extend React\Curry\Curry for custom behavior:
class CustomCurry extends \React\Curry\Curry {
public static function apply($func, ...$args) {
// Add validation or logging
if (!is_callable($func)) {
throw new \InvalidArgumentException('Function must be callable');
}
return parent::apply($func, ...$args);
}
}
Laravel Facade Create a facade for easier access:
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Facade;
Facade::register('Partial', function () {
return new class {
public function apply($func, ...$args) {
return \React\Curry\Curry::apply($func, ...$args);
}
};
});
Usage:
$partial = Partial::apply($func, $arg);
Integration with Laravel Events Create a trait for partial event listeners:
trait PartialListener {
protected function partialListener($event, $handler, ...$args) {
return Curry::apply($handler, ...$args);
}
}
Usage:
Event::listen('user.created', $this->partialListener(
'user.created',
[$notifier, 'sendEmail'],
'welcome
How can I help you explore Laravel packages today?