https://github.com/boehm-s/fun-php
Functional programming utilities for PHP
https://github.com/boehm-s/fun-php
compositional-data function-composition functional-programming ramdajs
Last synced: 28 days ago
JSON representation
Functional programming utilities for PHP
- Host: GitHub
- URL: https://github.com/boehm-s/fun-php
- Owner: boehm-s
- License: mit
- Created: 2020-03-30T20:27:55.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2021-08-12T17:26:17.000Z (over 4 years ago)
- Last Synced: 2023-11-20T12:22:11.227Z (over 2 years ago)
- Topics: compositional-data, function-composition, functional-programming, ramdajs
- Language: PHP
- Size: 979 KB
- Stars: 29
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# fun-php  [](https://codecov.io/gh/boehm-s/fun-php) [](https://codeclimate.com/github/boehm-s/fun-php/maintainability)
**fun**ctional 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](https://boehm-s.github.io/fun-php/)
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
```json
{
"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
```php
$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
```