Skip to content

Commit f0512e9

Browse files
committed
[Functional] Add Either::getOrThrow method.
1 parent 7e1b080 commit f0512e9

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/Fp/Functional/Either/Either.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,25 @@ public function getOrCall(callable $fallback): mixed
6565
: $fallback();
6666
}
6767

68+
/**
69+
* ```php
70+
* >>> Either::right(1)->getOrThrow(fn($err) => new RuntimeException($err));
71+
* => 1
72+
*
73+
* >>> Either::left('error')->getOrThrow(fn($err) => new RuntimeException($err));
74+
* RuntimeException with message 'error'
75+
* ```
76+
*
77+
* @psalm-param callable(L): Throwable $fallback
78+
* @psalm-return R
79+
*/
80+
public function getOrThrow(callable $fallback): mixed
81+
{
82+
return $this->isRight()
83+
? $this->value
84+
: throw $fallback($this->value);
85+
}
86+
6887
/**
6988
* Combine two Either into one
7089
*

tests/Runtime/Classes/Either/EitherTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Fp\Functional\Validated\Invalid;
1212
use Fp\Functional\Validated\Valid;
1313
use PHPUnit\Framework\TestCase;
14+
use RuntimeException;
1415

1516
final class EitherTest extends TestCase
1617
{
@@ -136,10 +137,21 @@ public function testGetOrElse(): void
136137
{
137138
$this->assertEquals(1, Either::right(1)->getOrElse(0));
138139
$this->assertEquals(0, Either::left('err')->getOrElse(0));
140+
}
141+
142+
public function testGetOrCall(): void
143+
{
139144
$this->assertEquals(1, Either::right(1)->getOrCall(fn() => 0));
140145
$this->assertEquals(0, Either::left('err')->getOrCall(fn() => 0));
141146
}
142147

148+
public function testGetOrThrow(): void
149+
{
150+
$this->assertEquals(1, Either::right(1)->getOrThrow(fn($err) => new RuntimeException($err)));
151+
$this->expectExceptionMessage('err');
152+
Either::left('err')->getOrThrow(fn($err) => new RuntimeException($err));
153+
}
154+
143155
public function testOrElse(): void
144156
{
145157
$this->assertEquals(

0 commit comments

Comments
 (0)