ClojureScript의 영구 데이터 구조와 바닐라 JavaScript용 지원 API에 대한 간단한 연결입니다. 풀 요청을 환영합니다.
이제 API는 관용적인 JavaScript 명명 규칙을 사용합니다.
Mori는 최근 ClojureScript 컴파일러의 향상된 기능 덕분에 전반적으로 훨씬 더 빨라졌습니다. Mori에 대한 불변 데이터 구조 구현을 벤치마킹하려는 사용자를 위해 Mori는 이제 arity 디스패치에서 이전 호출 오버헤드를 제거하는 직접 arity 호출을 노출합니다. 자세한 내용은 벤치마킹을 참조하세요.
Mori 해시 맵은 이제 필요에 따라 자동으로 PersistentHashMap
으로 승격되는 ClojureScript ArrayMap
으로 기본 설정됩니다. ArrayMap
은 작은 크기와 간단한 키를 사용할 때 훨씬 더 나은 성능을 제공합니다. 예를 들어, 8개 이하의 키를 가진 Mori 해시 맵은 이제 Immutable.js 3.6.2 Map
s보다 거의 10배 빠르게 구축될 수 있습니다.
모든 Mori 컬렉션은 foo[Symbol.iterator]
또는 foo["@@iterator"]
를 통해 ES6 반복을 지원합니다.
npm을 통해 최신 릴리스를 설치할 수 있습니다.
npm install mori
설치된 패키지에는 최적화된 단일 JavaScript 파일 mori.js
포함되어 있습니다.
다른 모듈과 마찬가지로 Node.js 프로그램에 mori
로드합니다.
var mori = require ( "mori" ) ;
브라우저에서는 다른 JavaScript 라이브러리와 마찬가지로 스크립트 태그를 사용하여 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 ( ) ;
}
모든 Mori 맵과 세트는 제안된 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 제안에서 변경될 수 있습니다.
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가 설치되어 있지 않은 경우 먼저 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
빌드 프로세스는 Node.js, 웹 브라우저 또는 기타 JavaScript 환경에서 사용하기에 적합한 최적화된 JavaScript 파일 mori.js
생성합니다. AMD 모듈로 로드할 수도 있습니다.
저작권 (C) 2012-2015 David Nolen 및 기여자
Clojure와 마찬가지로 Eclipse Public License에 따라 배포됩니다.