import { concat, identical, identity, pipe, when, reduce } 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.<Array|string>} list List containing elements that will be concatenated
* @return {Array|string|undefined} Concatenated elements
* @see {@link http://ramdajs.com/docs/#concat|concat}
* @see {@link RA.concatRight|concatRight}
* @see {@link http://ramdajs.com/docs/#unnest|unnest}
* @see {@link http://ramdajs.com/docs/#join|join}
* @example
*
* concatAll([[1], [2], [3]]); //=> [1, 2, 3]
* concatAll(['1', '2', '3']); //=> '123'
* concatAll([]); //=> undefined;
*/
const concatAll = pipe(
reduce(concat, leftIdentitySemigroup),
when(identical(leftIdentitySemigroup), stubUndefined)
);
export default concatAll;