Un puente simple hacia las estructuras de datos persistentes de ClojureScript y las API de soporte para JavaScript básico. Se aceptan solicitudes de extracción.
La API ahora utiliza convenciones de nomenclatura JavaScript idiomáticas.
Mori es considerablemente más rápido en todos los ámbitos gracias a las recientes mejoras en el compilador ClojureScript. Para los usuarios que deseen comparar sus implementaciones de estructura de datos inmutables con Mori, Mori ahora expone invocaciones directas de arity, lo que elimina los gastos generales de llamadas anteriores del despacho de arity. Consulte Evaluación comparativa para obtener más información.
Los mapas hash de Mori ahora utilizan de forma predeterminada ClojureScript ArrayMap
que se promocionan automáticamente a PersistentHashMap
según sea necesario. Los ArrayMap
ofrecen un rendimiento considerablemente mejor en tamaños pequeños y cuando se utilizan teclas simples. Por ejemplo, un mapa hash Mori con menos o igual a ocho claves ahora se puede construir casi un orden de magnitud más rápido que Immutable.js 3.6.2 Map
s.
Todas las colecciones de Mori admiten la iteración de ES6 mediante foo[Symbol.iterator]
o foo["@@iterator"]
.
Puede instalar la última versión a través de npm:
npm install mori
El paquete instalado contiene un único archivo JavaScript optimizado mori.js
Cargue mori
en sus programas Node.js como lo haría con cualquier otro módulo:
var mori = require ( "mori" ) ;
En un navegador, puedes cargar mori con una etiqueta script, como lo harías con cualquier otra biblioteca de JavaScript:
< script src =" mori.js " type =" text/javascript " > </ script >
También puedes cargarlo como un módulo AMD, por ejemplo con RequireJS.
Puedes usarlo desde tus proyectos de esta manera:
var inc = function ( n ) {
return n + 1 ;
} ;
mori . intoArray ( mori . map ( inc , mori . vector ( 1 , 2 , 3 , 4 , 5 ) ) ) ;
// => [2,3,4,5,6]
¡Actualizaciones eficientes y no destructivas!
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
¡Secuencias perezosas!
var _ = mori ;
_ . intoArray ( _ . interpose ( "foo" , _ . vector ( 1 , 2 , 3 , 4 ) ) ) ;
// => [1, "foo", 2, "foo", 3, "foo", 4]
O si es más tu velocidad, ¡úsalo desde CoffeeScript!
inc = ( x ) -> x + 1
r = mori . map inc, mori . vector ( 1 , 2 , 3 , 4 , 5 )
mori . intoArray r
Puede encontrar documentación extensa y ejemplos aquí.
Para vectores y mapas proporcionamos operaciones eficientes de descongelación y congelación:
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 ( ) ;
}
Todos los mapas y conjuntos de Mori admiten todos los métodos no mutantes de las interfaces ES6 Map y Set propuestas. La principal diferencia con la especificación es que la búsqueda de claves se basa en el valor, no en la referencia. Los métodos keys
, values
y entries
devuelven los iteradores mutables propuestos:
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"}
Esta característica está sujeta a cambios en la propuesta ES6.
Mori incluye Transductores. Operaciones de recaudación de asignación cero 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 ) ;
Primero deberá instalar el SDK de Java, si aún no está instalado en su sistema.
En Windows, deberá instalar Leiningen manualmente. En sistemas tipo UNIX, Leiningen se instalará dentro del proyecto automáticamente si el ejecutable lein
no se encuentra en su ruta o si su versión lein
es anterior a 2.0.0
.
git clone https://github.com/swannodette/mori.git
cd mori
./scripts/build.sh
npm run-script build
./scripts/build.ps1
El proceso de compilación generará un archivo JavaScript optimizado mori.js
, que es adecuado para usar con Node.js, o en un navegador web u otros entornos JavaScript. También puedes cargarlo como un módulo AMD.
Copyright (C) 2012-2015 David Nolen y colaboradores
Distribuido bajo Licencia Pública Eclipse, al igual que Clojure.