Skip to content

Instantly share code, notes, and snippets.

@Heimdell
Last active February 5, 2019 15:56
Show Gist options
  • Save Heimdell/be8eabd3fb2fff873ac9e6afe98d2701 to your computer and use it in GitHub Desktop.
Save Heimdell/be8eabd3fb2fff873ac9e6afe98d2701 to your computer and use it in GitHub Desktop.
// Задача: написать односвязный иммутабельный список и несколько функций для него.
let List = {
// Пустой список. Поскольку он иммутабельный, хватит и одного на все списки.
//
empty: undefined,
// Присоединить элемент head к списку tail.
//
// Список tail при этом не меняется.
//
cons: (head, tail) => undefined,
// Извлечь первый элемент списка.
//
head: list => undefined,
// Список без первого элемента.
//
tail: list => undefined,
isEmpty: list => undefined,
// Сделать список из массива посредством empty и cons
//
from: (array) => undefined,
// Применить функцию f к каждому элементу списка, вернуть список результатов
//
map: f => list => undefined,
// Отобрать список значений, удовлетворяющих условию pred.
//
filter: pred => list => undefined,
// Свернуть список (List<A>) функцией f : (X, A) -> A начиная со значения a : A справа.
//
// > let res = list.reduce(o, f, list.from([a, b, c, ..., z]))
//
// res должно стать f(a, f(b, f(c, ... f(z, o) ...)))
//
// (аналогично Array.prototype.reduceRight)
//
reduce: a => f => list => undefined,
// Свернуть список (List<A>) функцией f : (A, X) -> A начиная со значения a : A справа.
//
// > let res = list.reduceLeft(o, f, list.from([a, b, c, ..., z]))
//
// res должно стать f(... f(f(f(o, a), b), c) ..., z)
//
// (аналогично Array.prototype.reduce)
//
reduceLeft: a => f => list => undefined,
}
let pipe = (x, ...fs) => {
let y = x
fs.forEach(f => y = f(y))
return y
}
let unshift = (x, arr) => [x].concat(arr)
let assert = require('assert')
assert.deepEqual(
pipe([1,2,3],
List.from,
List.map (x => x + 1),
List.filter (x => (x & 1) == 0),
List.reduce ([]) (unshift)
),
[2, 4]
)
module.exports = List
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment