บริดจ์ง่ายๆ ไปยังโครงสร้างข้อมูลถาวรของ ClojureScript และรองรับ API สำหรับ vanilla JavaScript ยินดีต้อนรับคำขอดึง
ขณะนี้ API ใช้หลักการตั้งชื่อ JavaScript แบบสำนวน
Mori ทำงานได้รวดเร็วยิ่งขึ้นอย่างมาก ต้องขอบคุณการปรับปรุงล่าสุดในคอมไพเลอร์ ClojureScript สำหรับผู้ใช้ที่ต้องการเปรียบเทียบการใช้งานโครงสร้างข้อมูลที่เปลี่ยนแปลงไม่ได้กับ Mori ตอนนี้ Mori จะเปิดเผยการเรียกใช้ Arity โดยตรง ซึ่งกำจัดค่าใช้จ่ายในการเรียกก่อนหน้านี้จากการจัดส่ง Arity ดูการเปรียบเทียบสำหรับข้อมูลเพิ่มเติม
ตอนนี้แผนที่แฮชของ Mori มีค่าเริ่มต้นเป็น ClojureScript ArrayMap
ที่ได้รับการเลื่อนระดับเป็น PersistentHashMap
โดยอัตโนมัติตามความจำเป็น ArrayMap
มอบประสิทธิภาพที่ดีขึ้นอย่างมากในขนาดที่เล็กและเมื่อมีการเล่นคีย์ธรรมดา ตัวอย่างเช่น แผนที่แฮชของ Mori ที่มีคีย์น้อยกว่าหรือเท่ากับแปดคีย์ สามารถสร้างลำดับความสำคัญได้เร็วกว่า 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 ( ) ;
}
แผนที่และชุด 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
โมริรวมถึงทรานสดิวเซอร์ด้วย การดำเนินการรวบรวมการจัดสรรเป็นศูนย์ 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 ได้
ลิขสิทธิ์ (C) 2012-2015 David Nolen และผู้มีส่วนร่วม
เผยแพร่ภายใต้ Eclipse Public License เช่นเดียวกับ Clojure