ClojureScript の永続データ構造とバニラ JavaScript のサポート API へのシンプルなブリッジ。プルリクエストは大歓迎です。
API では、慣用的な JavaScript 命名規則が使用されるようになりました。
最近の ClojureScript コンパイラの機能強化のおかげで、Mori は全体的にかなり高速になっています。不変のデータ構造実装を Mor に対してベンチマークしたいユーザーのために、Mori はアリティのディスパッチによる以前の呼び出しオーバーヘッドを排除する直接的なアリティ呼び出しを公開するようになりました。詳細については、「ベンチマーク」を参照してください。
Mor ハッシュ マップはデフォルトで ClojureScript ArrayMap
になり、必要に応じて自動的にPersistentHashMap
に昇格されます。 ArrayMap
は、サイズが小さく、単純なキーが使用されている場合に、かなり優れたパフォーマンスを提供します。たとえば、8 キー以下の森ハッシュ マップは、Immutable.js 3.6.2 Map
よりもほぼ 1 桁速く構築できるようになりました。
すべての Moe コレクションはfoo[Symbol.iterator]
またはfoo["@@iterator"]
を介した ES6 反復をサポートします。
最新リリースは npm 経由でインストールできます。
npm install mori
インストールされたパッケージには、単一の最適化された JavaScript ファイルmori.js
が含まれています。
他のモジュールと同様に、Node.js プログラムにmori
をロードします。
var mori = require ( "mori" ) ;
ブラウザでは、他の JavaScript ライブラリと同様に、script タグを使用して mori をロードできます。
< script src =" mori.js " type =" text/javascript " > </ script >
たとえば、RequireJS を使用して、AMD モジュールとしてロードすることもできます。
次のようにプロジェクトから使用できます。
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 ( ) ;
}
すべての Mor マップとセットは、提案された ES6 マップおよびセット インターフェイスのすべての非突然変異メソッドをサポートします。仕様との主な違いは、キーの検索が参照ではなく値に基づいていることです。 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 プロポーザルで変更される可能性があります。
森にはトランスデューサーが含まれます。ゼロ割り当てコレクション操作 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 がまだインストールされていない場合は、まず Java SDK をインストールする必要があります。
Windows では、Leiningen を手動でインストールする必要があります。 UNIX 系システムでは、 lein
実行可能ファイルがパス上に見つからない場合、またはlein
バージョンが2.0.0
より前の場合、Leiningen がプロジェクト内に自動的にインストールされます。
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 での使用、または Web ブラウザーやその他の JavaScript 環境での使用に適しています。 AMD モジュールとしてロードすることもできます。
著作権 (C) 2012-2015 David Nolen および寄稿者
Clojure と同じ Eclipse Public License に基づいて配布されます。