Un simple pont vers les structures de données persistantes de ClojureScript et la prise en charge des API pour JavaScript Vanilla. Les demandes de tirage sont les bienvenues.
L'API utilise désormais des conventions de dénomination JavaScript idiomatiques.
Mori est considérablement plus rapide dans tous les domaines grâce aux récentes améliorations apportées au compilateur ClojureScript. Pour les utilisateurs qui souhaitent comparer leurs implémentations de structure de données immuables à Mori, Mori expose désormais les invocations d'arité directes, ce qui élimine les frais généraux d'appel précédents liés à la répartition d'arité. Voir Analyse comparative pour plus d'informations.
Les cartes de hachage Mori sont désormais par défaut des ArrayMap
ClojureScript qui sont automatiquement promues en PersistentHashMap
si nécessaire. ArrayMap
offrent des performances considérablement meilleures dans les petites tailles et lorsque de simples touches sont en jeu. Par exemple, une carte de hachage Mori avec moins ou égale à huit clés peut désormais être construite presque un ordre de grandeur plus rapidement que Immutable.js 3.6.2 Map
s.
Toutes les collections Mori prennent en charge l'itération ES6 via foo[Symbol.iterator]
ou foo["@@iterator"]
.
Vous pouvez installer la dernière version via npm :
npm install mori
Le package installé contient un seul fichier JavaScript optimisé mori.js
.
Chargez mori
dans vos programmes Node.js comme vous le feriez pour n'importe quel autre module :
var mori = require ( "mori" ) ;
Dans un navigateur, vous pouvez charger mori avec une balise de script, comme vous le feriez pour n'importe quelle autre bibliothèque JavaScript :
< script src =" mori.js " type =" text/javascript " > </ script >
Vous pouvez également le charger en tant que module AMD, par exemple avec RequireJS.
Vous pouvez l'utiliser à partir de vos projets comme ceci :
var inc = function ( n ) {
return n + 1 ;
} ;
mori . intoArray ( mori . map ( inc , mori . vector ( 1 , 2 , 3 , 4 , 5 ) ) ) ;
// => [2,3,4,5,6]
Mises à jour efficaces et non destructives !
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
Des séquences paresseuses !
var _ = mori ;
_ . intoArray ( _ . interpose ( "foo" , _ . vector ( 1 , 2 , 3 , 4 ) ) ) ;
// => [1, "foo", 2, "foo", 3, "foo", 4]
Ou si c'est plus votre vitesse, utilisez-le depuis CoffeeScript !
inc = ( x ) -> x + 1
r = mori . map inc, mori . vector ( 1 , 2 , 3 , 4 , 5 )
mori . intoArray r
Vous pouvez trouver une documentation complète et des exemples ici.
Pour les vecteurs et les cartes, nous proposons des opérations de dégel et de gel efficaces :
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 ( ) ;
}
Toutes les cartes et ensembles Mori prennent en charge toutes les méthodes sans mutation des interfaces ES6 Map et Set proposées. La principale différence avec la spécification est que la recherche de clé est basée sur une valeur et non sur une référence. Les méthodes keys
, values
et entries
renvoient les itérateurs mutables proposés :
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"}
Cette fonctionnalité est sujette à des modifications dans la proposition ES6.
Mori inclut des transducteurs. Opérations de collecte à allocation nulle 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 ) ;
Vous devrez d'abord installer le SDK Java, s'il n'est pas déjà installé sur votre système.
Sous Windows, vous devrez installer manuellement Leiningen. Sur les systèmes de type UNIX, Leiningen sera automatiquement installé dans le projet si l'exécutable lein
n'est pas trouvé sur votre chemin ou si votre version lein
est antérieure à 2.0.0
.
git clone https://github.com/swannodette/mori.git
cd mori
./scripts/build.sh
npm run-script build
./scripts/build.ps1
Le processus de construction générera un fichier JavaScript optimisé mori.js
, qui peut être utilisé avec Node.js, ou dans un navigateur Web ou d'autres environnements JavaScript. Vous pouvez également le charger en tant que module AMD.
Copyright (C) 2012-2015 David Nolen et contributeurs
Distribué sous la licence publique Eclipse, la même que Clojure.