Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# 4 space indentation
[*.js]
indent_style = space
indent_size = 4
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ out-*
*init.clj
.DS_Store
.idea
release
release
dev
10 changes: 5 additions & 5 deletions scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ set -e

echo "Finalizing mori.js"

(cat support/wrapper.beg.txt; cat mori.bare.js; cat support/wrapper.end.txt) > mori.js

echo "Deleting mori.bare.js"

rm mori.bare.js
(cat support/wrapper.beg.txt;
cat ./release/build/mori.base.js;
cat ./release/build/mori.extra.js;
cat ./release/build/mori.mutable.js;
cat support/wrapper.end.txt) > mori.js

echo "Build finished."
217 changes: 111 additions & 106 deletions spec/mori-spec.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var mori = require("../mori");

var mori = require("../mori"),
extra = mori.extra;
describe("Map", function () {
it("demonstrates mapping a function over a vector", function () {
var inc = function (n) { return n + 1; },
Expand Down Expand Up @@ -36,130 +36,135 @@ describe("Lazy sequences", function () {
});
});

describe("Pipelines", function () {
it("demonstrates function pipelining", function () {
var pipeRes = mori.pipeline(
mori.vector(1,2,3),
function(v) { return mori.conj(v,4); },
function(v) { return mori.drop(2, v); }
);
expect(mori.intoArray(pipeRes)).toEqual([3,4]);
describe("Mori Extra", function() {

describe("Pipelines", function () {
it("demonstrates function pipelining", function () {
var pipeRes = extra.pipeline(
mori.vector(1,2,3),
function(v) { return mori.conj(v,4); },
function(v) { return mori.drop(2, v); }
);
expect(mori.intoArray(pipeRes)).toEqual([3,4]);
});
});
});

describe("Currying", function () {
it("demonstrates function currying", function () {
var curRes = mori.pipeline(
mori.vector(1,2,3),
mori.curry(mori.conj, 4),
mori.curry(mori.conj, 5)
);
expect(mori.intoArray(curRes)).toEqual([1,2,3,4,5]);
describe("Currying", function () {
it("demonstrates function currying", function () {
var curRes = extra.pipeline(
mori.vector(1,2,3),
extra.curry(mori.conj, 4),
extra.curry(mori.conj, 5)
);
expect(mori.intoArray(curRes)).toEqual([1,2,3,4,5]);
});
});
});

describe("Partial application", function () {
it("demonstrates partial function application", function () {
var parRes = mori.pipeline(
mori.vector(1,2,3),
mori.curry(mori.conj, 4),
mori.partial(mori.drop, 2)
);
expect(mori.intoArray(parRes)).toEqual([3, 4]);
describe("Partial application", function () {
it("demonstrates partial function application", function () {
var parRes = extra.pipeline(
mori.vector(1,2,3),
extra.curry(mori.conj, 4),
mori.partial(mori.drop, 2)
);
expect(mori.intoArray(parRes)).toEqual([3, 4]);
});
});
});


describe("Function composition", function () {
it("demonstrates function composition", function () {
var second = mori.comp(mori.first, mori.rest);
var secRes = second(mori.vector(1,2,3));
expect(secRes).toEqual(2);
describe("Function composition", function () {
it("demonstrates function composition", function () {
var second = mori.comp(mori.first, mori.rest);
var secRes = second(mori.vector(1,2,3));
expect(secRes).toEqual(2);
});
});
});

describe("Juxtaposition", function () {
it("demonstrates function juxtaposition", function () {
var posAndNeg = mori.juxt(mori.identity, function (v) { return -v; });
var pnRes = posAndNeg(1);
expect(mori.intoArray(pnRes)).toEqual([1,-1]);
var knitRes = mori.knit(mori.inc, mori.dec)(posAndNeg(1));
expect(mori.intoArray(knitRes)).toEqual([2,-2]);
describe("Juxtaposition", function () {
it("demonstrates function juxtaposition", function () {
var posAndNeg = mori.extra.juxt(mori.identity, function (v) { return -v; });
var pnRes = posAndNeg(1);
expect(mori.intoArray(pnRes)).toEqual([1,-1]);
var knitRes = extra.knit(mori.inc, mori.dec)(posAndNeg(1));
expect(mori.intoArray(knitRes)).toEqual([2,-2]);
});
});
});

describe("Conversion utilities", function () {
it("demonstrates conversion from clojurescript values to javascript objects, and vice versa", function () {
var jsObj = { a: 1, b: "two" },
jsArr = [1, 2, 3],
cljMap = mori.hashMap("a", 1, "b", "two"),
cljMapKeywordized = mori.hashMap(mori.keyword("a"), 1, mori.keyword("b"), "two"),
cljVec = mori.vector(1, 2, 3);
expect(mori.equals(mori.toClj(jsObj), cljMap)).toBe(true);
expect(mori.equals(mori.toClj(jsObj,true), cljMapKeywordized)).toBe(true);
expect(mori.equals(mori.toClj(jsArr), cljVec)).toBe(true);
expect(mori.toJs(cljMap)).toEqual(jsObj);
expect(mori.toJs(cljVec)).toEqual(jsArr);
expect(mori.isVector(mori.toClj(jsArr))).toBe(true);
describe("Conversion utilities", function () {
it("demonstrates conversion from clojurescript values to javascript objects, and vice versa", function () {
var jsObj = { a: 1, b: "two" },
jsArr = [1, 2, 3],
cljMap = mori.hashMap("a", 1, "b", "two"),
cljMapKeywordized = mori.hashMap(mori.keyword("a"), 1, mori.keyword("b"), "two"),
cljVec = mori.vector(1, 2, 3);
expect(mori.equals(extra.toClj(jsObj), cljMap)).toBe(true);
expect(mori.equals(extra.toClj(jsObj,true), cljMapKeywordized)).toBe(true);
expect(mori.equals(extra.toClj(jsArr), cljVec)).toBe(true);
expect(mori.toJs(cljMap)).toEqual(jsObj);
expect(mori.toJs(cljVec)).toEqual(jsArr);
expect(mori.isVector(extra.toClj(jsArr))).toBe(true);
});
});
});

describe("Distinct", function() {
it("demonstrates function `distinct`", function() {
var vec = mori.vector(1,1,1,1,2,2,3,4,5,6,6);
var distinctVector = mori.distinct(vec);
expect(mori.toJs(distinctVector)).toEqual([1,2,3,4,5,6]);
});
});

describe("configure", function() {
it("can tune *print-length*", function() {
mori.configure("print-length", 5);
expect(mori.range(10).toString()).toEqual("(0 1 2 3 4 ...)");
mori.configure("print-length", 3);
expect(mori.range(5).toString()).toEqual("(0 1 2 ...)");
mori.configure("print-length", null);
expect(mori.range(5).toString()).toEqual("(0 1 2 3 4)");
});
it("can tune *print-level*", function() {
mori.configure("print-level", 3);
var m = mori;
expect(m.vector(1, m.vector(2, m.vector(3, m.vector(4, m.vector(5))))).toString()).toEqual("[1 [2 [3 #]]]");
mori.configure("print-level", 1);
expect(m.hashMap(1, m.hashMap(2, 3)).toString()).toEqual("{1 #}");
mori.configure("print-level", null);
expect(m.vector(1, m.vector(2, m.vector(3, m.vector(4)))).toString()).toEqual("[1 [2 [3 [4]]]]");
describe("Distinct", function() {
it("demonstrates function `distinct`", function() {
var vec = mori.vector(1,1,1,1,2,2,3,4,5,6,6);
var distinctVector = mori.distinct(vec);
expect(mori.toJs(distinctVector)).toEqual([1,2,3,4,5,6]);
});
});
});

describe("Queue", function() {
it("can be initialized empty", function() {
var q = mori.queue();
expect(mori.isEmpty(q)).toBeTruthy();
describe("configure", function() {
it("can tune *print-length*", function() {
extra.configure("print-length", 5);
expect(mori.range(10).toString()).toEqual("(0 1 2 3 4 ...)");
extra.configure("print-length", 3);
expect(mori.range(5).toString()).toEqual("(0 1 2 ...)");
extra.configure("print-length", null);
expect(mori.range(5).toString()).toEqual("(0 1 2 3 4)");
});
it("can tune *print-level*", function() {
extra.configure("print-level", 3);
var m = mori;
expect(m.vector(1, m.vector(2, m.vector(3, m.vector(4, m.vector(5))))).toString()).toEqual("[1 [2 [3 #]]]");
extra.configure("print-level", 1);
expect(m.hashMap(1, m.hashMap(2, 3)).toString()).toEqual("{1 #}");
extra.configure("print-level", null);
expect(m.vector(1, m.vector(2, m.vector(3, m.vector(4)))).toString()).toEqual("[1 [2 [3 [4]]]]");
});
});

it("can be initialized with values", function() {
var q = mori.queue('a', 'b');
expect(mori.isEmpty(q)).toBeFalsy();
expect(mori.peek(q)).toEqual('a');
describe("Queue", function() {
it("can be initialized empty", function() {
var q = extra.queue();
expect(mori.isEmpty(q)).toBeTruthy();
});

it("can be initialized with values", function() {
var q = extra.queue('a', 'b');
expect(mori.isEmpty(q)).toBeFalsy();
expect(mori.peek(q)).toEqual('a');
});
});
});

describe("lazy-seq", function() {
it("can be used build non-stack-blowing seq functions", function() {
var m = mori;
var fib = function(a, b) {
return m.cons(a, m.lazySeq(function() {
return fib(b, b + a);
}));
};
describe("lazy-seq", function() {
it("can be used build non-stack-blowing seq functions", function() {
var m = mori;
var fib = function(a, b) {
return m.cons(a, extra.lazySeq(function() {
return fib(b, b + a);
}));
};

var fibs = m.take(10, fib(1, 1));
var fibs = m.take(10, fib(1, 1));

expect(m.toJs(fibs)).toEqual([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);
expect(m.toJs(fibs)).toEqual([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);

// Numbers can only be so big
var bigFib = m.last(m.take(2000, fib(1, 1)));
expect(bigFib).toEqual(Infinity);
// Numbers can only be so big
var bigFib = m.last(m.take(2000, fib(1, 1)));
expect(bigFib).toEqual(Infinity);
});
});
});

})