Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

boehm-s/fun-php

Open more actions menu

Repository files navigation

fun-php Build Status codecov Maintainability

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

About

Functional programming utilities for PHP

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.