boehm_s / fun
Functional programming utilities for PHP
Installs: 1 468
Dependents: 0
Suggesters: 0
Security: 0
Stars: 30
Watchers: 2
Forks: 2
Open Issues: 0
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8
README
functional programming utilities for PHP ! Inspired by Ramda, Javascript, lodash and many other things !
Why ?
- Because PHP lacks of simple and easy-to-use utilities for functional programming !
- To prove that we can still have fun with PHP (despite the fact that it's PHP) !!!
Installation
composer require boehm_s/fun
How to use it ?
You can review the API Documentation
Or, if you're familiar with Ramda, you can start writing code right now. As with Ramda, fun-php methods are automatically curried :
F::map($fn, $array)
⇔ F::map($fn)($array)
⇔ F::map()($fn)($array)
Also placeholders are implemented. fun-php placeholder is F::_
:
F::map(F::_, $array)($fn)
⇔ F::map($fn)(F::_)($array)
⇔ F::map(F::_)($fn)($array)
Example
{ "items": [{ "id":1, "type":"train", "users":[ { "id":1, "name":"Jimmy Page"}, { "id":5, "name":"Roy Harper"} ] }, { "id":421, "type":"hotel", "users":[ { "id":1, "name":"Jimmy Page" }, { "id":2, "name":"Robert Plant" } ] }, { "id":876, "type":"flight", "users":[ { "id":3, "name":"John Paul Jones" }, { "id":4, "name":"John Bonham" } ] }] }
Get all users names
$get_all_users_names = F::pipe( F::prop('items'), F::flatMap(F::prop('users')), F::map(F::prop('name')), F::uniq() ); $travel = json_decode($travelJSON); $travels_users = $get_all_users_names($travel); var_dump($travels_users); // ["Jimmy Page", "Roy Harper", "Robert Plant", "John Paul Jones", "John Bonham"]
Implemented methods
fun-php is just a bunch of static methods. To use them, juste prefix the following functions with F::
For Lists / Arrays
function | type | function | type |
---|---|---|---|
map | ((a, i, [a]) → b) → [a] → [b] |
flatMap | ((a, i, [a]) → [b]) → [a] → [b] |
filter | ((a, i, [a]) → Bool) → [a] → [a] |
reduce | ((a, b) → a) → a → [b] → a |
each | (a → _) → [a] → [a] |
||
find | ((a, i, [a]) → Bool) → [a] → a |
findIndex | ((a, i, [a]) → Bool) → [a] → i |
some | ((a, i, [a]) → Bool) → [a] → Bool |
every | ((a, i, [a]) → Bool) → [a] → Bool |
sort | ((a, a) → Bool) → [a] → [a] |
reverse | [a] → [a] |
includes | a → [a] → Bool |
uniq | [a] → [a] |
splitAt | Number → [a] → [[a], [a]] |
uniqBy | (a → b) → [a] → [a] |
For Objects / Associative arrays
function | type | function | type |
---|---|---|---|
prop | k → {k: v} → v | null |
pick | [k] → {k: v} → {k: v} | null |
props | [k] → {k: v} → [v] |
||
propEq | k → v → {k: v} → Bool |
propSatisfies | (v → Bool) → k → {k: v} → Bool |
propOr | k → d → {k: v} → v | d |
merge | {k: v} → ({k: v}, ..., {k: v}) → {k: v} |
For function composition
function | type |
---|---|
compose | ((y → z), (x → y), ... ,(a → b)) → (a → z) |
pipe | ((a → b), (b → c), ... , (y → z)) → (a → z) |
partial | ((a, b, ..., n) → x) → [a, b, ...] → ((d, e, ..., n) → x) |
Logical operations
function | type |
---|---|
not | * → Bool |
Notes (to myself)
Deploying the doc :
git subtree push --prefix doc/dist/html origin gh-pages