f-utility
Version:
functional utilities
222 lines (200 loc) • 7.22 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.merge = exports.__merge = exports.mapKeys = exports.__mapKeys = exports.mapTuple = exports.mapTuples = exports.pairwiseObject = exports.__pairwiseObject = exports.pairwise = exports.__pairwise = exports.fromPairs = exports.toPairs = exports.entries = exports.assign = exports.freeze = exports.values = exports.keys = undefined;
var _assign2 = require("object-assign");
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _katsuCurry = require("katsu-curry");
var _reduce = require("./reduce");
var _map = require("./map");
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// import {alterFirstIndex, alterLastIndex} from './array'
var _keys = Object.keys,
_freeze = Object.freeze,
_assign = _assign2;
/**
* Object.keys
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
* @method keys
* @param {Object} a - an object
* @returns {Array} - an array of keys
* @public
* @example
* import {keys} from 'f-utility'
* keys({a: 1, b: 2}) // [`a`, `b`]
*/
var keys = exports.keys = _keys;
/**
* @method values
* @param {Object} x - input
* @returns {Strings[]} values - an array of properties
* @public
* @example
* import {values} from 'f-utility'
* values({a:1, b: 2, c: 3}) // [1, 2, 3]
*/
var values = exports.values = function values(x) {
return keys(x).map(function (y) {
return x[y];
});
};
/**
* Object.freeze
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
* @method freeze
* @param {Object} a - an object
* @returns {Object} - a frozen object
* @public
* @example
* import {freeze} from 'f-utility'
* const immutable = freeze({a: 1, b: 2})
* immutable.a = 5 // throws error
*/
var freeze = exports.freeze = _freeze;
/**
* Object.assign
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
* @method assign
* @param {Object} a - any number of objects
* @returns {Object} - a merged object
* @public
* @example
* import {assign} from 'f-utility'
* assign({c: 3}, {a: 1, b: 2}) // {a: 1, b: 2, c: 3}
*/
var assign = exports.assign = _assign;
/**
* Object.entries shim
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
* @method entries
* @param {Object} o - an object
* @returns {Array} - an array of tuples [key, value] pairs
* @public
* @example
* import {entries} from 'f-utility'
* entries({a: 1, b: 2}) // [[`a`, 1], [`b`, 2]]
*/
var entries = exports.entries = function entries(o) {
return (0, _katsuCurry.pipe)(keys, (0, _map.map)(function (k) {
return [k, o[k]];
}))(o);
};
/**
* An alias of `entries`
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
* @method toPairs
* @param {Object} o - an object
* @returns {Array} - an array of tuples [key, value] pairs
* @public
* @example
* import {toPairs} from 'f-utility'
* toPairs({a: 1, b: 2}) // [[`a`, 1], [`b`, 2]]
*/
var toPairs = exports.toPairs = entries;
/**
* convert a list of key value pairs into an object
* @method fromPairs
* @param {Array} - a list of [key, value] pairs
* @returns {Object} merged results
* @public
* @example
* import {fromPairs} from 'f-utility'
* fromPairs([[`a`, 1], [`b`, 2]]) // {a: 1, b: 2}
*/
var fromPairs = exports.fromPairs = (0, _reduce.reduce)(function (agg, _ref) {
var _ref2 = _slicedToArray(_ref, 2),
k = _ref2[0],
v = _ref2[1];
return merge(agg, _defineProperty({}, k, v));
}, {});
/**
* modify a toPairs / fromPairs pipeline with a higher-order function
* @method pairwise
* @param {Function} hoc - a function which wraps a given function, like map or filter
* @param {Function} fn - a function which iterates over [key, value] tuples
* @param {Object} o - object
* @returns {Object} a mapped object
* @public
* @example
* import {filter, mapTuples, pairwiseObject} from 'f-utility'
* const input = {
* a: 1,
* b: 2,
* c: 3
* }
* const fn = ([k, v]) => ([k.toUpperCase(), v * 2])
* // we could map it
* mapTuples(fn, input) // {A: 2, B: 4, C: 6}
* // or we can use pairwiseObject
* pairwiseObject(filter, ([k, v]) => v % 2 !== 0, input) // {a: 1, c: 3}
*/
var __pairwise = exports.__pairwise = function __pairwise(hoc, fn, o) {
return (0, _katsuCurry.pipe)(toPairs, hoc(fn))(o);
};
var pairwise = exports.pairwise = (0, _katsuCurry.curry)(__pairwise);
var __pairwiseObject = exports.__pairwiseObject = function __pairwiseObject(hoc, fn, o) {
return (0, _katsuCurry.pipe)(pairwise(hoc, fn), fromPairs)(o);
};
var pairwiseObject = exports.pairwiseObject = (0, _katsuCurry.curry)(__pairwiseObject);
/**
* a simple object tuple-mapper
* @method mapTuples
* @param {Function} fn - a function which maps over [key, value] tuples
* @param {Object} o - object
* @returns {Object} a mapped object
* @public
* @example
* import {mapTuples} from 'f-utility'
* const input = {
* a: 1,
* b: 2,
* c: 3
* }
* const fn = ([k, v]) => ([k.toUpperCase(), v * 2])
* mapTuples(fn, input) // {A: 2, B: 4, C: 6}
*/
var mapTuples = exports.mapTuples = pairwiseObject(_map.map);
var mapTuple = exports.mapTuple = mapTuples;
/**
* a simple object key-only tuple-mapper
* @method mapKeys
* @param {Function} fn - a function which maps over values only
* @param {Object} o - object
* @returns {Object} a mapped object
* @public
* @example
* import {mapKeys} from 'f-utility'
* const input = {
* a: 1,
* b: 2,
* c: 3
* }
* const fn = (v) => `__${v}`
* mapKeys(fn, input) // {__a: 1, __b: 2, __c: 3}
*/
var __mapKeys = exports.__mapKeys = function __mapKeys(fn, o) {
return mapTuples(function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
k = _ref4[0],
v = _ref4[1];
return [fn(k), v];
}, o);
};
var mapKeys = exports.mapKeys = (0, _katsuCurry.curry)(__mapKeys);
/**
* object.assign but enforced as a binary function
* @method merge
* @param {Object} a - object a
* @param {Object} b - object b
* @returns {Object} c - the results of merging a and b
* @public
* @example
* import {merge} from 'f-utility'
* merge({c: 3}, {a: 1, b: 2}) // {a: 1, b: 2, c: 3}
*
*/
var __merge = exports.__merge = function __merge(a, b) {
return assign({}, a, b);
};
var merge = exports.merge = (0, _katsuCurry.curry)(__merge);
;