Основные возможности платформы Hexlet не доступны в вашем браузере. Пожалуйста, обновитесь.

Практика: Списки на базе строк

Необходимо реализовать набор функций для работы со списками, построенными на базе строк. Данный вид списка представляет собой текст, где каждая строчка - это элемент списка, например:

hello
world

Это пример списка с двумя элементами hello и world.

solution.js

Реализуйте и экспортируйте следующие функции:

l(...items) - функция-конструктор

const list = l('foo', 'bar', 'baz');

toString(list) - возвращает строковое представление списка

const list = l('foo', 'bar', 'baz');
toString(list); // (foo, bar, baz)

head(list) - возвращает первый элемент списка

const list = l('foo', 'bar', 'baz');
const first = head(list); // 'foo'

tail(list) - возвращает "хвост" списка (все элементы, кроме первого)

const list = l('foo', 'bar', 'baz');
const rest = tail(list); // l('bar', 'baz')

empty(list) - проверяет является ли список пустым

const list = l('foo', 'bar', 'baz');

console.log(empty(list)); // false
console.log(empty(l()));  // true

append(list, item) - добавляет элемент в конец списка и возвращает новый список

const list = l('foo', 'bar', 'baz');
const newList = append(list, 'bas'); // l('foo', 'bar', 'baz', 'bas')

filter(callback, list) - фультрует список, используя callback-функцию

const list = l('foo', 'bar', 'baz');
const filteredList = filter(item => item[0] === 'b', list); // l('bar', 'baz')

map(callback, list) - преобразует список, используя callback-функцию

const list = l('foo', 'bar', 'baz');
const mappedList = map(item => item.substr(1), list); // l('oo', 'ar', 'az')

reduce(callback, init, list) - производит свертывание списка

const list = l('foo', 'bar', 'baz');
const result = reduce((acc, item) => acc ? `${acc},${item}` : item, '', list);
console.log(result); // foo,bar,baz