Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(presence): implemented presence function #2123

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ export { default as isNaturalNumber } from './isNaturalNumber';
export { default as isPrimitive } from './isPrimitive';
export { default as isNotPrimitive } from './isNotPrimitive';
export { default as isSentinelValue } from './isSentinelValue';
export { default as isBlank } from './isBlank';
export { default as isBlank } from './internal/isBlank';
// Function
export { default as stubUndefined } from './stubUndefined';
export { default as stubNull } from './stubNull';
Expand Down Expand Up @@ -197,6 +197,7 @@ export { default as inRange } from './inRange';
export { default as notEqual } from './notEqual';
export { default as overlaps } from './overlaps';
// Logic
export { default as presence } from './presence';
export { default as isNotEmpty } from './isNotEmpty';
export { default as defaultWhen } from './defaultWhen';
export { default as notBoth } from './notBoth';
Expand Down
2 changes: 1 addition & 1 deletion src/isBlank.js → src/internal/isBlank.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { isEmpty, isNil, anyPass, test } from 'ramda';

import isFalse from './isFalse';
import isFalse from '../isFalse';
/**
* Returns `true` if the given value is its type's empty value, `false`, `undefined`
* as well as strings containing only whitespace characters; `false` otherwise.
Expand Down
41 changes: 41 additions & 0 deletions src/presence.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import * as R from 'ramda';

import isBlank from './internal/isBlank';

/**
* Returns the receiver if it’s present, otherwise returns `null`.
*
* @func presence
* @memberOf RA
* @since {@link https://char0n.github.io/ramda-adjunct/3.2.0|v3.2.0}
* @category Logic
* @sig a -> a | null
* @see {@link http://ramdajs.com/docs/#isEmpty|R.isEmpty}
* @param {*} val The value to test
* @return {*}
* @example
*
* RA.presence({ foo: 'foo' }) // => { foo: 'foo' }
* RA.presence({}) // => null
* RA.presence(false) // => null
* RA.presence(true) // => true
* RA.presence('') // => null
* RA.presence(' ') // => null
* RA.presence('\t\n') // => null
* RA.presence('foo') // => foo
* RA.presence([]) // => null
* RA.presence([1, 2, 3]) // => [1, 2, 3]
* RA.presence(undefined) // => null
* RA.presence(0) // => 0
* RA.presence(null) // => null
*/

const presence = R.cond([
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
[R.equals(false), R.always(null)],
[isBlank, R.always(null)],
[R.isEmpty, R.always(null)],
[R.isNil, R.always(null)],
[R.T, R.identity],
]);

export default presence;
28 changes: 28 additions & 0 deletions test/internal/isBlank.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { assert } from 'chai';
import * as R from 'ramda';

import { isBlank } from '../../src';

describe('isBlank', function () {
it('should test value for a `Blank`', function () {
assert.isTrue(isBlank(''));
assert.isTrue(isBlank(' '));
assert.isTrue(isBlank('\t\n'));
assert.isTrue(isBlank({}));
assert.isTrue(isBlank(null));
assert.isTrue(isBlank(undefined));
assert.isTrue(isBlank([]));
assert.isTrue(isBlank(false));

assert.isFalse(isBlank('value'));
assert.isFalse(isBlank({ foo: 'foo' }));
assert.isFalse(isBlank([1, 2, 3]));
assert.isFalse(isBlank(true));
});

it('should support placeholder to specify "gaps"', function () {
const _isBlank = isBlank(R.__);

assert.isTrue(_isBlank(''));
});
});
28 changes: 0 additions & 28 deletions test/isBlank.js

This file was deleted.

93 changes: 93 additions & 0 deletions test/presence.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { assert } from 'chai';

import * as RA from '../src';

describe('presence', function () {
context('given an object', function () {
specify('should return the object', function () {
const val = { foo: 'foo' };

assert.strictEqual(RA.presence(val), val);
});
});

context('given an empty object', function () {
specify('should return null', function () {
const val = {};

assert.strictEqual(RA.presence(val), null);
});
});

context('given a boolean with value false', function () {
specify('should return null', function () {
const val = false;

assert.strictEqual(RA.presence(val), null);
});
});

context('given a boolean with value true', function () {
specify('should return boolean true', function () {
const val = true;

assert.strictEqual(RA.presence(val), val);
});
});

context('given an empty string', function () {
specify('should return null', function () {
assert.strictEqual(RA.presence(''), null);
assert.strictEqual(RA.presence(' '), null);
assert.strictEqual(RA.presence('\t\n'), null);
});
});

context('given a string', function () {
specify('should return the correct string', function () {
const val = 'val';

assert.strictEqual(RA.presence(val), val);
});
});

context('given an empty array', function () {
specify('should return null', function () {
const val = [];

assert.strictEqual(RA.presence(val), null);
});
});

context('given an array with values', function () {
specify('should return the array', function () {
const val = [1, 2, 3];

assert.strictEqual(RA.presence(val), val);
});
});

context('given an undefined', function () {
specify('should return null', function () {
const val = undefined;

assert.strictEqual(RA.presence(val), null);
});
});

context('given a number', function () {
specify('should return number', function () {
const val = 0;

assert.strictEqual(RA.presence(val), val);
});
});

context('given a null', function () {
specify('should return null', function () {
const val = null;

assert.strictEqual(RA.presence(val), val);
});
});
});