Функциональная библиотека Javascript с постоянными структурами данных
Я ищу функциональную библиотеку с постоянными структурами данных. Мне нужны только вложенные массивы и словари. Есть несколько функциональных библиотек JavaScript, но они не ориентированы на неизменность. Я хочу уметь писать
var dict = makeDictionary({
'foo': 1;
'bar': {
'ely': 2;
}
});
var newDict = dict.assoc('foo', 42).assoc('bar', 'tender', 30).dissoc('bar', 'ely');
assert.eq dict.bar.ely, 2; // unchanged
assert.eq newDict.bar.tender, 30; // added
assert.eq newDict.bar.ely, undefined; // removed
Хотя подчеркивание в некоторых случаях близко, особенно для массивов, оно изменяет аргументы словаря. Я мог бы также использовать clojurescript, но я бы предпочел более легкий подход.
4 ответа
Я завершил свою реализацию Persistent Map (и скоро завершу работу с Persistent Vector) для JavaScript, потому что, похоже, существует растущий спрос.
Есть несколько особенностей по сравнению, например, с Java (отсутствие равенства, hashCode, на который можно положиться), поэтому реализация использует отсортированное сбалансированное двоичное дерево (балансировка фактически упрощается и ускоряется благодаря неизменности) и === для равенства и <или пользовательская функция для ниже чем.
код Feat.js (кодовое название проекта) доступен по адресу feat-sorted-map.js на github.com
Вы можете увидеть страницу с рабочими тестами в действии онлайн на feat.js на cofylang.org
В настоящее время нет документации, кроме исходного кода и тестов, но я также работаю над ее завершением.
Обновление: там есть реализация постоянного вектора, и скорость была увеличена на порядки. (он также был очищен) feat-vector.js на github.com
Я бы посмотрел на Мори. Он упаковывает функциональную структуру данных ClojureScript для использования из простого старого Javascript. Поскольку структуры данных взяты из ClojureScript, я ожидаю, что они будут лучше протестированы, более полны и более производительны, чем другие библиотеки.
Есть также:
https://github.com/hughfdjackson/immutable
Который основан на постоянном алгоритме хеши здесь:
https://github.com/hughfdjackson/persistent-hash-trie
Может быть стоит посмотреть.
Код для этого лучше imho, но мои тесты показывают, что он работает почти на порядок медленнее, чем приведенный выше.
Самый популярный и, насколько я знаю, единственный, который все еще находится в активной разработке, — это https://immutable-js.com/.
но если вам нужен более богатый API, вы также можете использовать Mori, но я не уверен, что это будет намного более легкий подход, чем непосредственное использование ClojureScript.