PHP code example of tmciver / functional-php
1. Go to this page and download the library: Download tmciver/functional-php 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/ */
tmciver / functional-php example snippets
$listFactory = new LinkedListFactory();
$emptyList = $listFactory->empty();
$arr = ['apples', 'oranges', 'bananas'];
$l = $listFactory->fromNativeArray($arr);
// $l = LinkedList('apples', 'oranges', 'bananas');
$l = $listFactory->range('a', 'f', 2);
// $l = LinkedList('a', 'c', 'e');
$l1 = $listFactory->fromNativeArray([1, 2, 3]);
$l2 = $listFactory->fromNativeArray([4, 5, 6]);
$l3 = $l1->append($l2);
// $l3 = LinkedList(1, 2, 3, 4, 5, 6);
$l = $listFactory->fromNativeArray([1, 2, 3]);
$linc = $l->map(function ($x) { return $x + 1; });
// $linc = LinkedList(2, 3, 4);
$l = $listFactory->fromNativeArray(["Hello", "world"]);
$explodedStrs = $l->flatMap(function ($s) use ($listFactory) {
return $listFactory->fromNativeArray(str_split($s));
});
// $explodedStrs = LinkedList('H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd');
$firstThree = function ($s) { return substr($s, 0, 3); };
$fs = $listFactory->fromNativeArray(['strtoupper', $firstThree]);
$args = $listFactory->fromNativeArray(["Hello", "world"]);
$result = $fs->apply($args);
// $result = LinkedList("HELLO", "WORLD", "Hel", "wor");
$result = $fs($args);
// $result = LinkedList("HELLO", "WORLD", "Hel", "wor");
$one = function () { return 1; };
$fs = $listFactory->fromNativeArray(['time', $one]);
$vals = $fs();
// $vals = LinkedList(1527883005, 1);
$divideTwelveBy = function ($denom) {
return ($denom == 0) ?
Maybe::nothing() :
Maybe::fromValue(12 / $denom);
};
$l = $listFactory->fromNativeArray([1, 2, 3, 4]);
$divisions = $l->traverse($divideTwelveBy);
// $divisions = Just(LinkedList(12, 6, 4, 3));
$l = $listFactory->fromNativeArray([1, 0, 3, 4]);
$divisions = $l->traverse($divideTwelveBy);
// $divisions = Nothing;
$l = $listFactory->fromNativeArray([
Maybe::fromValue(1),
Maybe::fromValue(2),
Maybe::fromValue(3)
]);
$m = $l->sequence();
// $m = Just(LinkedList(1, 2, 3));
$l = $listFactory->fromNativeArray([1, 2, 3, 4]);
$add = function ($x, $y) { return $x + $y; };
$sum = $l->foldLeft(0, $add);
// $sum = 10
$mult = function ($x, $y) { return $x * $y; };
$product = $l->foldLeft(1, $mult);
// $product = 24
$l1 = $listFactory->fromNativeArray([1, 2, 3]);
$l2 = $listFactory->fromNativeArray([4, 5, 6]);
$cons = function ($x, $l) { return $l->cons($x); };
$l1PlusL2 = $l1->foldRight($l2, $cons);
// $l1PlusL2 = LinkedList(1, 2, 3, 4, 5, 6);
$nothing = Maybe::nothing();
$monoid = $nothing;
$list = $this->makeListFromArray([Maybe::fromValue("hello"),
$nothing,
Maybe::fromValue(" world!")]);
$result = $list->fold($monoid);
// $result = Just("hello world!")
$nothing = Maybe::nothing();
$monoid = $nothing;
$list = $this->makeListFromArray(["hello", " world!"]);
$toMonoid = function ($v) { return Maybe::fromValue($v); };
$result = $list->foldMap($monoid, $toMonoid);
// $result = Just("hello world!")
$l = $listFactory->fromNativeArray([1, 2, 3, 4, 5]);
$isOdd = function ($n) { return $n % 2 == 1; };
$lOdd = $l->filter($isOdd);
// $lOdd = LinkedList(1, 3, 5)
$maybeInt = Maybe::fromValue($myInt);
$maybeInt = Maybe::nothing();
// preferred
$a = Maybe::fromValue(5);
$b = Maybe::nothing();
$a->getOrElse(0); // yields 5
$b->getOrElse(0); // yields 0
$a = Maybe::fromValue('apples');
$maybeUppercase = $a->map('strtoupper');
// $maybeUppercase = Just('APPLES');
$a = Maybe::fromValue('apples');
$maybeUppercaseOfFirstLetter = $a->map('strtoupper')
->map(function ($str) {
return substr($str, 0, 1);
});
// $maybeUppercaseOfFirstLetter = Just('A');
function head($array) {
if (is_array($array)) {
if (count($array) > 0) {
$vals = array_values($array);
$h = Maybe::fromValue($array[0]);
} else {
$h = Maybe::nothing();
}
} else {
$h = Maybe::nothing();
}
return $h;
}
$a = Maybe::fromValue(['apples', 'oranges', 'bananas']);
$b = $a->map('head');
// $b = Just(Just('apples'));
$a = Maybe::fromValue(['apples', 'oranges', 'bananas']);
$b = $a->flatMap('head');
// $b = Just('apples');
$just1 = Maybe::fromValue(1);
$just2 = Maybe::fromValue(2);
$nothing = Maybe::nothing();
$just1->append($nothing); // Just(1);
$nothing->append($just1); // Just(1);
$just1->append($just2); // Just([1, 2]);
$just2->append($just1); // Just([2, 1]);
$nothing->append($nothing); // Nothing();
// Ugly, but gets the job done.
if ($myMaybe instanceof Just) {
$myVal = $myMaybe->get();
$response = response("<p>$myVal is: " . $myVal . ".</p>");
} else {
$response = response("There was no value!", 400);
}
// A little better.
if ($myMaybe->isNothing()) {
$response = response("There was no value!", 400);
} else {
$myVal = $myMaybe->get();
$response = response("<p>$myVal is: " . $myVal . ".</p>");
}
class MaybeToHttpResponse implements MaybeVisitor {
public function visitJust($just) {
$myVal = $just->get();
return response("<p>$myVal is: " . $myVal . ".</p>");
}
public function visitNothing($nothing) {
return response("There was no value!", 400);
}
}
$response = $myMaybe->accept(new MaybeToHttpResponse());
$myEither = Either::fromValue($someVal);
$myEither = Either::left('Houston, we have a problem!');
$aa = new AssociativeArray([1,2,3]);
$a = new AssociativeArray([Maybe::fromValue(1), Maybe::fromValue(2), Maybe::fromValue(3)]);
$m = Maybe::nothing();
$b = $a->sequence($m); // $b = Just([1,2,3]);
function divide($x, $y) {
if ($y == 0) {
$eitherResult = Either::left('Division by zero!');
} else {
$eitherResult = Either::fromValue($x/$y);
}
return $eitherResult;
}
$dividend = 12;
$divisors = [2, 4, 6];
$intsArray = new AssociativeArray($divisors);
$m = Either::left('');
$eitherResults = $intsArray->traverse(function ($i) use ($dividend) {
return divide($dividend, $i);
}, $m);
// $eitherResults = Right([6,3,2]);
$a = new AssociativeArray([Maybe::fromValue(1), Maybe::nothing(), Maybe::fromValue(3)]);
$m = Maybe::nothing();
$b = $a->sequence($m); // $b = Nothing();