2017 © Pedro Peláez
 

library maybe-php

A Maybe monad implementation for PHP

image

yitznewton/maybe-php

A Maybe monad implementation for PHP

  • Tuesday, April 28, 2015
  • by yitznewton
  • Repository
  • 1 Watchers
  • 5 Stars
  • 3 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 5 Versions
  • 0 % Grown

The README.md

Travis build status PHP 5.3 not supported PHP 5.4 supported PHP 5.5 supported PHP 5.6 supported HHVM tested BSD 2-Clause license, (*1)

A Maybe monad implementation for PHP

This project was wholly inspired by a blog post by @linepogl., (*2)

Motivation

Dealing with null values (and, in PHP, falsy values) is tedious and prone to developer error (viz the null pointer exception, trying to dereference a null)., (*3)

In my exposure to Haskell, I learned about the awesomeness of pattern matching, whereby you can get the compiler to force yourself to handle all possibilities. This combines with a tool called Maybe to require specific handling for "null" and "non-null" possibilities., (*4)

PHP does not offer pattern matching, but we can still use classes to wrap raw values, and require us to handle null conditions, without repeated explicit null checking and conditionals., (*5)

Examples

Simple

Before:, (*6)

$blogpost = $repository->get($blogpostId);
echo $blogpost->teaser();  // oh noe! what if $blogpost is null?! :boom:

After:, (*7)

$blogpost = new \Yitznewton\Maybe\Maybe($repository->get($blogpostId));
echo $blogpost->select(function ($bp) { $bp->teaser(); })->valueOr('No blogpost found');

With callback

$blogpost = new \Yitznewton\Maybe\Maybe($repository->get($blogpostId));
$callback = function () {
    return someExpensiveOperation();
};
echo $blogpost->select(function ($bp) { $bp->teaser(); })->valueOrCallback($callback);

Loose-falsy

// $process->execute() normally returns a result object, but sometimes returns false
$result = new LooseMaybe($process->execute());

echo $result->select(function ($resultObject) { $resultObject->getStatus(); })->valueOr('failed');
// echoes 'failed' when the result was false

Performance

In a simple test using PHP 5.5, performance was approximately 20% that of a straight is_null() check in an if/else conditional. In other words it takes 5 times as long to run., (*8)

You can reproduce the test locally by running the profiling testsuite in PHPUnit. You will first need to install XHProf, and override the XHProf lib directory using a local phpunit.xml config., (*9)

$ ./vendor/bin/phpunit --testsuite=profiling

Dictionary wrapper

maybe-php includes an array wrapper called Dictionary, whereby trying to access properties on the wrapper will return a Maybe object. You can specify whether to return a plain Maybe (default) or a LooseMaybe., (*10)

$dictionary = new \Yitznewton\Maybe\Dictionary([
    'foo' => 'bar',
]);

$dictionary->foo->valueOr('quux');        // 'bar'
$dictionary->noSuchKey->valueOr('quux');  // 'quux'

// with LooseMaybe

$dictionary = new \Yitznewton\Maybe\Dictionary([
    'foo' => false,
], \Yitznewton\Maybe\LooseMaybe::class);

$dictionary->foo->valueOr('quux'); // 'quux', because loose falsy

The Versions

28/04 2015

dev-master

9999999-dev

A Maybe monad implementation for PHP

  Sources   Download

BSD-2-Clause

The Requires

 

The Development Requires

by Yitzchak Schaffer

03/11 2014

0.2.2

0.2.2.0

A Maybe monad implementation for PHP

  Sources   Download

BSD-2-Clause

The Requires

  • php >=5.4

 

The Development Requires

by Yitzchak Schaffer

02/11 2014

0.2.1

0.2.1.0

A Maybe monad implementation for PHP

  Sources   Download

BSD-2-Clause

The Requires

  • php >=5.4

 

The Development Requires

by Yitzchak Schaffer

02/11 2014

0.2.0

0.2.0.0

A Maybe monad implementation for PHP

  Sources   Download

BSD-2-Clause

The Requires

  • php >=5.4

 

The Development Requires

by Yitzchak Schaffer

02/11 2014

0.1.0

0.1.0.0

A Maybe monad implementation for PHP

  Sources   Download

BSD-2-Clause

The Requires

  • php >=5.4

 

The Development Requires

by Yitzchak Schaffer