Skip to content

Commit 6e1a210

Browse files
committed
Add valueOrDefault()
1 parent e9cf3ba commit 6e1a210

4 files changed

Lines changed: 99 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).<Paste>
44

55
## [Unreleased]
66

7+
## [0.2.4] - 2015-03-27
8+
### Added
9+
- `valueOrDefault()`
10+
711
## [0.2.3] - 2016-03-22
812
### Added
913
- `concat()`

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,28 @@ function ($value) {
257257
return new Widget('first', $value, 'last');
258258
}
259259
```
260+
261+
#### T\valueOrDefault(mixed $default, callable $predicate = null)
262+
263+
```php
264+
T\valueOrDefault('default')
265+
266+
// Is equivalent to:
267+
268+
function ($value) {
269+
return $value ?: 'default';
270+
}
271+
```
272+
273+
A predicate function can also be supplied:
274+
275+
```php
276+
T\valueOrDefault('negative number', function ($value) {
277+
return $value >= 0;
278+
})
279+
280+
// Is equivalent to:
281+
282+
function ($value) {
283+
return $value >= 0 ? $value : 'negative number';
284+
}

src/transform.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,27 @@ function newInstance($className, array $arguments = [__])
272272
};
273273
}
274274

275+
/**
276+
* Returns a transformer which returns the value, or a default value if the
277+
* predicate fails when applied on the value. If no predicate is supplied then
278+
* a null check is performed.
279+
*
280+
* @param mixed $default
281+
* @param callable $predicate
282+
*
283+
* @return \Clojure
284+
*/
285+
function valueOrDefault($default, callable $predicate = null)
286+
{
287+
return function ($value) use ($default, $predicate) {
288+
if ($predicate === null) {
289+
return $value !== null ? $value : $default;
290+
}
291+
292+
return $predicate($value) ? $value : $default;
293+
};
294+
}
295+
275296
/**
276297
* @internal
277298
*

tests/ValueOrDefaultTest.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace tests\TomPHP\Transform;
4+
5+
use PHPUnit_Framework_TestCase;
6+
use TomPHP\Transform as T;
7+
8+
final class ValueOrDefaultTest extends PHPUnit_Framework_TestCase
9+
{
10+
/** @test */
11+
public function it_returns_value_if_it_is_not_null_and_no_predicate_is_supplied()
12+
{
13+
$fn = T\valueOrDefault('default');
14+
15+
$this->assertSame('value', $fn('value'));
16+
}
17+
18+
/** @test */
19+
public function it_returns_default_if_value_is_null_and_no_predicate_is_supplied()
20+
{
21+
$fn = T\valueOrDefault('default');
22+
23+
$this->assertSame('default', $fn(null));
24+
}
25+
26+
/** @test */
27+
public function it_returns_default_if_a_predicate_is_supplied_and_it_returns_false()
28+
{
29+
$predicate = function ($value) {
30+
return $value === 'success';
31+
};
32+
33+
$fn = T\valueOrDefault('default', $predicate);
34+
35+
$this->assertSame('default', $fn('fail'));
36+
}
37+
38+
/** @test */
39+
public function it_returns_value_if_a_predicate_is_supplied_and_it_returns_true()
40+
{
41+
$predicate = function ($value) {
42+
return $value === 'success';
43+
};
44+
45+
$fn = T\valueOrDefault('default', $predicate);
46+
47+
$this->assertSame('success', $fn('success'));
48+
}
49+
}

0 commit comments

Comments
 (0)