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 1 commit
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
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ export { default as sortByProps } from './sortByProps';
export { default as skipTake } from './skipTake';
export { default as rangeStep } from './rangeStep';
export { default as findOr } from './findOr';
export { default as presence } from './presence';
// Object
export { default as invoke } from './invoke';
export { default as invokeArgs } from './invokeArgs';
Expand Down
35 changes: 35 additions & 0 deletions src/presence.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import * as R from 'ramda';

/**
* Check if value is empty or undefined then returns null, otherwise, returns itself.
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
*
* @func presence
* @memberOf RA
* @since {@link https://char0n.github.io/ramda-adjunct/2.29.0|v2.29.0}
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* @category Object
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* @sig k -> null | k
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* @param {k} val The value to test
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* @return {null | k}
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* @example
*
* presence({ foo: 'foo' }) // { foo: 'foo' }
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved
* presence({}) // null
* presence(false) // null
* presence(true) // true
* presence('') // null
* presence('foo') // foo
* presence([]) // null
* presence([1, 2, 3]) // [1, 2, 3]
* presence(undefined) // null
* presence(0) // 0
* presence(null) // null
*/

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

export default presence;
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.only('presence', function () {
context('given an object', function () {
specify('should return the object', function () {
const foo = { foo: 'foo' };
tauantcamargo marked this conversation as resolved.
Show resolved Hide resolved

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

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

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

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

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

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

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

context('given an empty string', function () {
specify('should return null', function () {
const foo = '';

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

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

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

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

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

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

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

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

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

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

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

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

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