concat handles strings now too

This commit is contained in:
Rowan 2025-04-17 22:00:16 -05:00
parent 4dabfd8a43
commit 4ab7c265d8
2 changed files with 9 additions and 2 deletions

View file

@ -11,11 +11,13 @@ import { head, isIterable, concatIter, iter, tail } from './list.js'
*/
export const id = x => x
const bareValue = x => Array.isArray(x) || typeof x === 'string' || !isIterable(x)
export const concat = dispatch(['fantasy-land/concat', 'concat'],
(b, a) => {
if (Array.isArray(a) && (Array.isArray(b) || !isIterable(b))) {
if (Array.isArray(a) && bareValue(b)) {
return a.concat(b)
} else if (Array.isArray(b) && (Array.isArray(a) || !isIterable(a))) {
} else if (Array.isArray(b) && bareValue(a)) {
return b.concat(a)
} else {
return concatIter(iter(a), iter(b))

View file

@ -5,8 +5,13 @@ import { isIterable, iter } from '../..//src/list.js'
export const Functions = [
it('concat', () => {
assertEq(concat(1, []), [1])
assertEq(concat('a', []), ['a'])
assertEq(concat([], 1), [1])
assertEq(concat([], 'a'), ['a'])
assertEq(concat([2], [1]), [1, 2])
const a = concat([2], iter([1]))
assert(isIterable(a), 'concat([2], iter([1])) returned a non-iterable')
assertEq([...a], [1, 2])