PHP code example of majesko / fp-kit
1. Go to this page and download the library: Download majesko/fp-kit library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
majesko / fp-kit example snippets
declare(strict_types=1);
use function Majesko\FpKit\Functions\pipe;
use function Majesko\FpKit\Result\{ok, err, map as rmap, bind as rbind};
use function Majesko\FpKit\Option\{some, none, map as omap};
// Function composition with pipe
$result = pipe(
fn($x) => $x * 2,
fn($x) => $x + 10,
fn($x) => $x / 2
)(5); // Result: 10
// Safe error handling with Result
function divide(float $a, float $b): array {
return $b === 0.0 ? err('Division by zero') : ok($a / $b);
}
$result = divide(10, 2);
$doubled = rmap($result, fn($x) => $x * 2);
// ['ok' => true, 'value' => 10]
// Working with Option for nullable values
$user = ['name' => 'John', 'email' => '[email protected] '];
$email = omap(some($user['email'] ?? null), 'strtoupper');
// ['some' => true, 'value' => '[email protected] ']
use function Majesko\FpKit\Functions\pipe;
$transform = pipe(
fn($x) => $x * 2,
fn($x) => $x + 5,
fn($x) => "Result: $x"
);
echo $transform(10); // "Result: 25"
use function Majesko\FpKit\Functions\compose;
$f = fn($x) => $x + 1;
$g = fn($x) => $x * 2;
$composed = compose($f, $g); // Equivalent to: f(g(x))
echo $composed(5); // 11 (5 * 2 + 1)
use function Majesko\FpKit\Functions\{pipe, tap};
$result = pipe(
fn($x) => $x * 2,
tap(fn($x) => error_log("Debug: $x")), // Logs but doesn't modify
fn($x) => $x + 10
)(5); // Result: 20 (and logs "Debug: 10")
use function Majesko\FpKit\Functions\partial;
$multiply = fn($a, $b) => $a * $b;
$double = partial($multiply, 2);
echo $double(5); // 10
echo $double(8); // 16
use function Majesko\FpKit\Functions\{map, filter, reduce, groupBy, indexBy};
$numbers = [1, 2, 3, 4, 5];
// map: Transform each element
$doubled = map($numbers, fn($x) => $x * 2);
// [2, 4, 6, 8, 10]
// filter: Keep elements that match predicate
$evens = filter($numbers, fn($x) => $x % 2 === 0);
// [2, 4]
// reduce: Accumulate to a single value
$sum = reduce($numbers, fn($acc, $x) => $acc + $x, 0);
// 15
// groupBy: Group by key
$users = [
['name' => 'Alice', 'role' => 'admin'],
['name' => 'Bob', 'role' => 'user'],
['name' => 'Carol', 'role' => 'admin']
];
$byRole = groupBy($users, fn($u) => $u['role']);
// ['admin' => [['name' => 'Alice', ...], ['name' => 'Carol', ...]], 'user' => [...]]
// indexBy: Create associative array by key
$byName = indexBy($users, fn($u) => $u['name']);
// ['Alice' => ['name' => 'Alice', ...], 'Bob' => [...], ...]
use function Majesko\FpKit\Result\{ok, err};
$success = ok(42); // ['ok' => true, 'value' => 42]
$failure = err('Not found'); // ['ok' => false, 'error' => 'Not found']
use function Majesko\FpKit\Result\{isOk, isErr};
if (isOk($result)) {
// Handle success
}
if (isErr($result)) {
// Handle error
}
use function Majesko\FpKit\Result\{map, bind, mapError};
// map: Transform the success value
$result = ok(10);
$doubled = map($result, fn($x) => $x * 2);
// ['ok' => true, 'value' => 20]
// bind (flatMap): Chain operations that return Results
function parseNumber(string $s): array {
return is_numeric($s) ? ok((float) $s) : err('Not a number');
}
function squareRoot(float $n): array {
return $n >= 0 ? ok(sqrt($n)) : err('Negative number');
}
$result = bind(parseNumber('16'), fn($n) => squareRoot($n));
// ['ok' => true, 'value' => 4.0]
// mapError: Transform the error value
$result = err('user_not_found');
$mapped = mapError($result, fn($e) => "Error: $e");
// ['ok' => false, 'error' => 'Error: user_not_found']
use function Majesko\FpKit\Result\{matchResult, fold};
// matchResult: Pattern match on success/error
$message = matchResult(
$result,
ok: fn($value) => "Success: $value",
err: fn($error) => "Error: $error"
);
// fold: Extract value with fallback
$value = fold($result,
ok: fn($v) => $v,
err: fn($e) => 0
);
// unwrapOr: Get value or default
use function Majesko\FpKit\Result\unwrapOr;
$value = unwrapOr($result, 'default');
use function Majesko\FpKit\Result\{ok, err, bind};
use function Majesko\FpKit\Functions\pipe;
function findUser(int $id): array {
$user = getUserFromDb($id);
return $user ? ok($user) : err('User not found');
}
function validateUser(array $user): array {
return $user['active'] ?? false
? ok($user)
: err('User is inactive');
}
function getPermissions(array $user): array {
return ok($user['permissions'] ?? []);
}
$result = pipe(
fn() => findUser(123),
fn($r) => bind($r, fn($u) => validateUser($u)),
fn($r) => bind($r, fn($u) => getPermissions($u))
)();
// Result is either ok(['read', 'write']) or err('User not found')
use function Majesko\FpKit\Option\{some, none, fromNullable};
$present = some(42); // ['some' => true, 'value' => 42]
$absent = none(); // ['some' => false, 'value' => null]
// Create from potentially null value
$option = fromNullable($maybeNull);
use function Majesko\FpKit\Option\{map, bind};
// map: Transform the value if present
$option = some(10);
$doubled = map($option, fn($x) => $x * 2);
// ['some' => true, 'value' => 20]
$empty = none();
$result = map($empty, fn($x) => $x * 2);
// ['some' => false, 'value' => null] (no transformation)
// bind: Chain operations that return Options
$result = bind(some('[email protected] '), fn($email) =>
str_contains($email, '@') ? some(strtoupper($email)) : none()
);
use function Majesko\FpKit\Option\{matchOption, unwrapOr};
// matchOption: Handle both cases
$message = matchOption(
$option,
some: fn($value) => "Found: $value",
none: fn() => "Not found"
);
// unwrapOr: Get value or default
$value = unwrapOr($option, 'default');
use function Majesko\FpKit\Option\toResult;
$option = some(42);
$result = toResult($option, 'Value was None');
// ['ok' => true, 'value' => 42]
$option = none();
$result = toResult($option, 'Value was None');
// ['ok' => false, 'error' => 'Value was None']
use function Majesko\FpKit\Validation\{valid, invalid};
$success = valid(42); // ['valid' => true, 'value' => 42]
$failure = invalid(['Required']); // ['valid' => false, 'errors' => ['Required']]
use function Majesko\FpKit\Validation\{valid, invalid, combine};
function validateName(string $name): array {
$errors = [];
if (strlen($name) < 2) $errors[] = 'Name too short';
if (strlen($name) > 50) $errors[] = 'Name too long';
return empty($errors) ? valid($name) : invalid($errors);
}
function validateEmail(string $email): array {
return str_contains($email, '@')
? valid($email)
: invalid(['Invalid email']);
}
function validateAge(int $age): array {
return $age >= 18
? valid($age)
: invalid(['Must be 18 or older']);
}
// combine: Collect all errors
$result = combine([
validateName('A'), // Error: Name too short
validateEmail('invalid'), // Error: Invalid email
validateAge(15) // Error: Must be 18 or older
]);
// ['valid' => false, 'errors' => ['Name too short', 'Invalid email', 'Must be 18 or older']]
// All valid
$result = combine([
validateName('John Doe'),
validateEmail('[email protected] '),
validateAge(25)
]);
// ['valid' => true, 'value' => ['John Doe', '[email protected] ', 25]]
use function Majesko\FpKit\Validation\{lift, valid};
// lift: Apply a function to multiple Validations
$createUser = fn($name, $email, $age) => [
'name' => $name,
'email' => $email,
'age' => $age
];
$result = lift(
$createUser,
validateName('John'),
validateEmail('[email protected] '),
validateAge(25)
);
// ['valid' => true, 'value' => ['name' => 'John', 'email' => '[email protected] ', 'age' => 25]]
use function Majesko\FpKit\Validation\{matchValidation, errors};
$message = matchValidation(
$validation,
valid: fn($value) => "Valid: " . json_encode($value),
invalid: fn($errors) => "Errors: " . implode(', ', $errors)
);
// Get errors array
$errorList = errors($validation); // [] if valid, ['error1', 'error2'] if invalid