@ 2021-06-24T21:50:00Z )<?php
class SinglePlaceholder
{
}
class VariadicPlaceholder
{
}
$PLACEHOLDER = new SinglePlaceholder();
$VARIADIC_PLACEHOLDER = new VariadicPlaceholder();
function partial(callable $in, ...$args) {
$fmap = [];
$partialIndex = 0;
$variadic = false;
foreach ($args as $k => $arg) {
if ($arg instanceof SinglePlaceholder) {
$fmap[$partialIndex++] = $k;
}
if ($arg instanceof VariadicPlaceholder) {
$variadic = true;
if ($k < count($args) - 1) {
throw new ArgumentCountError('Only the last parameter may be a variadic placeholder');
}
$fmap[$partialIndex++] = $k;
}
}
return static function (...$partialArgs) use ($in, $args, $fmap, $variadic) {
if (count($partialArgs) < count($fmap)) {
throw new ArgumentCountError('Expected ' . count($fmap) . ' only received ' . count($partialArgs));
}
foreach ($partialArgs as $pIndex => $pValue) {
$targetSlot = $fmap[$pIndex] ?? null;
if ($targetSlot === null) {
if ($variadic) {
$args[] = $pValue;
}
else {
throw new ArgumentCountError('Too many arguments without a variadic placeholder');
}
}
else {
$args[$targetSlot] = $pValue;
}
}
return $in(...$args);
};
}
function foo($a, $b, $c, $d, $e) {
var_dump($a, $b, $c, $d, $e);
}
print_r(partial('foo', 1, $PLACEHOLDER, 3, $PLACEHOLDER, 5)(2, 4));
print_r(partial('foo', $VARIADIC_PLACEHOLDER)('a', 'b', 'c', 'd', 'e'));
print_r(partial('foo', 1, 2, 3, 4, 5)());
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 8.0.7 , 8.1.23 - 8.1.28 , 8.2.10 - 8.2.18 , 8.3.0 - 8.3.4 , 8.3.6 - 8.3.7 )int(1)
int(2)
int(3)
int(4)
int(5)
string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(1) "e"
int(1)
int(2)
int(3)
int(4)
int(5)
Output for 8.3.5 Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
)int(1)
int(2)
int(3)
int(4)
int(5)
string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(1) "e"
int(1)
int(2)
int(3)
int(4)
int(5)
preferences:dark mode live preview
68.03 ms | 402 KiB | 29 Q