Either
Familiar to those with some Functional Programming knowledge is the Either union composed of two sub-types - Left and Right. The transformable value is that of the Right type and the error value is the constituent of the Left.
either#
either(left, right, either)either :: (a -> c) -> (b -> c) -> Either a b -> c
Performs case analysis on the Either monad: applies the right function to a Right instance of the either value and a left function to a Left instance of the same value.
Since:
bingo-functional- v1.11.0
Arguments:
- left (function) - function to apply to an instance of Left
- right (function) - function to apply to an instance of Right
- either (object) - instance of Either monad
use Chemem\Bingo\Functional\Functors\Monads\Either;
$val = 10;
$result = Either\either( f\identity, fn (int $x): int => $x ** 2, Either::right($val)->filter(fn (int $x): bool => $x % 2 == 0, $val));fromRight & fromLeft#
fromRight|fromLeft(default, either)fromRight :: b -> Either a b -> b | fromLeft :: a -> Either a b -> a
Returns the contents of a Right|Left value if present and an arbitrary default value otherwise.
Since:
bingo-functional- v1.11.0
Argument(s):
- default (mixed) - default value
- either (object) - instance of
Eithermonad
use Chemem\Bingo\Functional\Functors\Monads\Either;
$left = Either::left(2);$right = Either::right(5);
echo Either\fromLeft(4, $right);
echo Either\fromRight(25, $left);lefts & rights#
rights|lefts(eithers)rights :: [Either a b] -> b | lefts :: [Either a b] -> a
Returns the Left|Right values in a list of Either type objects.
Since:
- bingo-functional - v1.11.0
Argument(s):
- eithers (array) - list of Either type objects
use Chemem\Bingo\Functional\Functors\Monads\Either;
$lefts = Either\lefts([ Either::left('foo'), Either::left('bar'), Either::right('baz')]);
$rights = Either\rights([ Either::right('foo'), Either::left('bar'), Either::right('baz')]);isRight & isLeft#
isRight(either) | isLeft(either)isRight :: Either a b -> Bool | isLeft :: Either a b -> Bool
Since:
bingo-functional- v1.11.0
Arguments:
- either (object) - instance of
Eithermonad
The isLeft and isRight functions ascertain if an either object one of either a Left type or Right type.
use Chemem\Bingo\Functional\Functors\Monads\Either;
$left = Either::left(2);$right = Either::right(5);
echo Either\isLeft(4, $right);
echo Either\isRight(25, $left);partitionEithers#
partitionEithers(eithers)partitionEithers :: [Either a b] -> [[a], [b]]
As is the case with Haskell, the partitionEithers() method transforms an array of Either type items into a multidimensional array of left and right indexed sub-arrays.
Since:
bingo-functional- v1.11.0
Arguments:
- eithers (array) - list of
Eithertype objects
use Chemem\Bingo\Functional\Functors\Monads\Either;
$eithers = Either\partitionEithers([ Either::right(12), Either::right(10), Either::left(INF), Either::left('Invalid Integer')]);