import { concat, identical, identity, pipe, reduce, when } from 'ramda'; import stubUndefined from './stubUndefined'; const leftIdentitySemigroup = { concat: identity }; /** * Returns the result of concatenating the given lists or strings. * Note: RA.concatAll expects all elements to be of the same type. It will throw an error if you concat an Array with a non-Array value. * Dispatches to the concat method of the preceding element, if present. Can also concatenate multiple elements of a [fantasy-land compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup). * Returns undefined if empty array was passed. * * @func concatAll * @memberOf RA * @since {@link https://char0n.github.io/ramda-adjunct/2.6.0|v2.6.0} * @category List * @sig [[a]] -> [a] | Undefined * @sig [String] -> String | Undefined * @sig Semigroup s => Foldable s f => f -> s | Undefined * @param {Array.} list List containing elements that will be concatenated * @return {Array|string|undefined} Concatenated elements * @see {@link http://ramdajs.com/docs/#concat|R.concat}, {@link RA.concatRight|concatRight}, {@link http://ramdajs.com/docs/#unnest|R.unnest}, {@link http://ramdajs.com/docs/#join|R.join} * @example * * concatAll([[1], [2], [3]]); //=> [1, 2, 3] * concatAll(['1', '2', '3']); //=> '123' * concatAll([]); //=> undefined * concatAll(null); //=> undefined */ const concatAll = pipe( reduce(concat, leftIdentitySemigroup), when(identical(leftIdentitySemigroup), stubUndefined) ); export default concatAll;