Простой мост к постоянным структурам данных ClojureScript и API-интерфейсам поддержки стандартного JavaScript. Запросы на вытягивание приветствуются.
API теперь использует идиоматические соглашения об именах JavaScript.
Mori работает значительно быстрее во всех отношениях благодаря недавним улучшениям компилятора ClojureScript. Для пользователей, которые хотели бы сравнить свои реализации неизменяемых структур данных с Mori, Mori теперь предоставляет прямые вызовы арности, которые устраняют предыдущие накладные расходы на вызовы из диспетчеризации арности. Дополнительную информацию см. в разделе «Бенчмаркинг».
Хэш-карты Мори теперь по умолчанию используют ClojureScript ArrayMap
, которые при необходимости автоматически повышаются до PersistentHashMap
. ArrayMap
обеспечивает значительно лучшую производительность при небольших размерах и при использовании простых клавиш. Например, хэш-карта Мори с количеством ключей меньше или равным восьми теперь может быть построена почти на порядок быстрее, чем Immutable.js 3.6.2 Map
s.
Все коллекции Mori поддерживают итерацию ES6 через foo[Symbol.iterator]
или foo["@@iterator"]
.
Вы можете установить последнюю версию через npm:
npm install mori
Установленный пакет содержит один оптимизированный файл JavaScript mori.js
Загрузите mori
в свои программы Node.js так же, как и любой другой модуль:
var mori = require ( "mori" ) ;
В браузере вы можете загрузить mori с помощью тега скрипта, как и любую другую библиотеку JavaScript:
< script src =" mori.js " type =" text/javascript " > </ script >
Вы также можете загрузить его как модуль AMD, например, с помощью RequireJS.
Вы можете использовать его в своих проектах следующим образом:
var inc = function ( n ) {
return n + 1 ;
} ;
mori . intoArray ( mori . map ( inc , mori . vector ( 1 , 2 , 3 , 4 , 5 ) ) ) ;
// => [2,3,4,5,6]
Эффективные неразрушающие обновления!
var v1 = mori . vector ( 1 , 2 , 3 ) ;
var v2 = mori . conj ( v1 , 4 ) ;
v1 . toString ( ) ; // => '[1 2 3]'
v2 . toString ( ) ; // => '[1 2 3 4]'
var sum = function ( a , b ) {
return a + b ;
} ;
mori . reduce ( sum , mori . vector ( 1 , 2 , 3 , 4 ) ) ; // => 10
Ленивые последовательности!
var _ = mori ;
_ . intoArray ( _ . interpose ( "foo" , _ . vector ( 1 , 2 , 3 , 4 ) ) ) ;
// => [1, "foo", 2, "foo", 3, "foo", 4]
Или, если вам больше подходит скорость, используйте CoffeeScript!
inc = ( x ) -> x + 1
r = mori . map inc, mori . vector ( 1 , 2 , 3 , 4 , 5 )
mori . intoArray r
Здесь вы можете найти обширную документацию и примеры.
Для векторов и карт мы обеспечиваем эффективные операции размораживания и замораживания:
var m = mori ;
// ~220ms with V8 version 3.29.80 MBP 2.26ghz
for ( var j = 0 ; j < 10 ; j ++ ) {
var s = new Date ( ) ;
var arr = [ ] ;
for ( var i = 0 ; i < 10000000 ; i ++ ) {
arr . push ( i ) ;
}
print ( "Array push " + arr . length + " items " + ( ( new Date ( ) ) - s ) ) ;
gc ( ) ;
}
// ~70ms
for ( var j = 0 ; j < 10 ; j ++ ) {
s = new Date ( ) ;
var mv = m . _thaw ( m . vector ( ) ) ;
for ( var i = 0 ; i < 10000000 ; i ++ ) {
mv = m . _conj . f2 ( mv , i ) ;
}
var v = m . _freeze ( mv ) ;
print ( "Mutable vector conj " + m . count ( v ) + " items " + ( ( new Date ( ) ) - s ) ) ;
gc ( ) ;
}
Все карты и наборы Мори поддерживают все неизменяемые методы предлагаемых интерфейсов ES6 Map и Set. Основное отличие от спецификации заключается в том, что поиск ключа основан на значении, а не на ссылке. keys
, values
и entries
возвращают предложенные изменяемые итераторы:
var m = mori ;
var h = m . hashMap ( "foo" , 1 , "bar" , 2 ) ;
h . has ( "foo" ) ; // => true
h . get ( "foo" ) ; // => 1
var iter = h . keys ( ) ;
iter . next ( ) ; // => {done: false, value: "foo"}
Эта функция может быть изменена в предложении ES6.
В состав Mori входят датчики. Операции по сбору нулевого распределения FTW:
var m = mori ;
var a = [ ] ;
for ( var i = 0 ; i < 1000000 ; i ++ ) {
a . push ( i ) ;
}
// make it immutable
var v = m . into ( m . vector ( ) , a ) ;
function time ( f ) {
var s = new Date ( ) ;
f ( ) ;
console . log ( ( ( new Date ( ) ) - s ) + "ms" ) ;
}
// ~190ms V8 version 3.29.80 MBP 2.26ghz
time ( function ( ) {
var xf = m . comp ( m . map ( m . inc ) , m . map ( m . inc ) , m . map ( m . inc ) ) ;
return m . transduce ( xf , m . completing ( m . sum ) , 0 , v ) ;
} , 10 ) ;
// ~440ms
time ( function ( ) {
return a . map ( m . inc ) . map ( m . inc ) . map ( m . inc ) . reduce ( function ( a , b ) { return a + b ; } , 0 ) ;
} , 10 ) ;
Сначала вам необходимо установить Java SDK, если он еще не установлен в вашей системе.
В Windows вам нужно будет вручную установить Leiningen. В UNIX-подобных системах Leiningen будет установлен в проекте автоматически, если исполняемый файл lein
не найден на вашем пути или если ваша версия lein
старше 2.0.0
.
git clone https://github.com/swannodette/mori.git
cd mori
./scripts/build.sh
npm run-script build
./scripts/build.ps1
В процессе сборки будет создан оптимизированный файл JavaScript mori.js
, который подходит для использования с Node.js, в веб-браузере или других средах JavaScript. Вы также можете загрузить его как модуль AMD.
Copyright (C) 2012–2015 Дэвид Нолен и соавторы
Распространяется по публичной лицензии Eclipse, как и Clojure.