on master help sign in
Update .js files for Foreign.JavaScript and new Signal operators.
commit9332a8a1525fccd92735a42902c6ceb6b45087a1 authorevancz <info@elm-lang.org> dateThu 28 Jun 2012, 03:50 (14 years ago) parenta49a51a
8 files changed+186−22
core-js/Data.js+83−2 core-js/Everything.js+2−11 core-js/Prelude.js+7−1 core-js/Value.js+34−1 core-js/cat-js.sh+1−1 core-js/foreign/JavaScript.js+13−2 core-js/runtime/Dispatcher.js+39−3 core-js/runtime/Signal.js+7−1
core-js/Data.js+83−2
@@ -23,7 +23,7 @@ var Maybe = function() {
2323 };
2424 }
2525 function mapCons(f) { return function(y) { return function(xs) {
26− var x = f(x);
26+ var x = f(y);
2727 if (x[0] === "Just") return ["Cons", x[1], xs];
2828 return xs;
2929 };
@@ -48,7 +48,88 @@ var Maybe = function() {
4848 };
4949}();
5050
51−return {String: { toText : Value.toText , properEscape : Value.properEscape } ,
51+var String = function() {
52+
53+ function append(s1) { return function(s2) {
54+ return s1.concat(s2);
55+ };
56+ }
57+ function map(f) { return function(s) {
58+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
59+ };
60+ }
61+
62+ function intercalate(sep) { return function(ss) {
63+ return Value.listToArray(ss).join(sep);
64+ };
65+ }
66+ function intersperse(sep) { return function(s) {
67+ return s.split("").join(sep);
68+ };
69+ }
70+
71+ function foldl(f) { return function(b) { return function(s) {
72+ var acc = b;
73+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
74+ return acc;
75+ };
76+ };
77+ }
78+ function foldr(f) { return function(b) { return function(s) {
79+ var acc = b;
80+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
81+ return acc;
82+ };
83+ };
84+ }
85+
86+ function concatMap(f) { return function(s) {
87+ var a = s.split("");
88+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
89+ return a.join("");
90+ };
91+ }
92+
93+ function forall(pred) { return function(s) {
94+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
95+ return true;
96+ };
97+ }
98+ function exists(pred) { return function(s) {
99+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
100+ return false;
101+ };
102+ }
103+
104+ return {cons : append,
105+ snoc : append,
106+ head : function(s) { return s[0]; },
107+ last : function(s) { return s[s.length-1]; },
108+ tail : function(s) { return s.slice(1); },
109+ length : function(s) { return s.length; },
110+ map : map,
111+ intercalate : intercalate,
112+ intersperse : intersperse,
113+ reverse : function(s) { return s.split("").reverse().join(""); },
114+ toLower : function(s) { return s.toLowerCase(); },
115+ toUpper : function(s) { return s.toUpperCase(); },
116+ foldl : foldl,
117+ foldr : foldr,
118+ concat : function(ss) { return Value.listToArray(ss).join(""); },
119+ concatMap : concatMap,
120+ forall : forall,
121+ exists : exists,
122+ /*
123+ filter : filter,
124+ take:,
125+ drop:,
126+ */
127+ toText : Value.toText,
128+ properEscape : Value.properEscape
129+ };
130+}();
131+
132+return {String: {toText:Value.toText, properEscape:Value.properEscape},
52133 Char:Char,
53134 Maybe:Maybe,
54135 List:List
core-js/Everything.js+2−11
@@ -1,15 +1,5 @@
11
2−var eq = function(x,y) {
3− if (typeof x === "object") {
4− if (x === y) return true;
5− if (x.length !== y.length) return false;
6− for (var i = x.length; i--; ) {
7− if (!eq(x[i],y[i])) return false;
8− }
9− return true;
10− }
11− return x === y;
12−};
2+var eq = Value.eq;
133
144var includeGlobal = this;
155(function() {
@@ -60,4 +50,5 @@ var ElmCode = {};
6050ElmCode.Data = Data;
6151ElmCode.Signal = Signal;
6252ElmCode.Data.List = List;
53+ElmCode.Foreign = Foreign;
6354ElmCode.Prelude = Prelude;
core-js/Prelude.js+7−1
@@ -80,6 +80,12 @@ var Prelude = function() {
8080 lift3 : Signal.lift3,
8181 lift4 : Signal.lift4,
8282 foldp : Signal.foldp,
83− constant : Signal.constant
83+ constant : Signal.constant,
84+ count : Signal.count,
85+ keepIf : Signal.keepIf,
86+ dropIf : Signal.dropIf,
87+ keepWhen : Signal.keepWhen,
88+ dropWhen : Signal.dropWhen,
89+ dropRepeats : Signal.dropRepeats
8490 };
8591}();
core-js/Value.js+34−1
@@ -1,5 +1,18 @@
11
22var Value = function(){
3+
4+ var eq = function(x,y) {
5+ if (typeof x === "object") {
6+ if (x === y) return true;
7+ if (x.length !== y.length) return false;
8+ for (var i = x.length; i--; ) {
9+ if (!eq(x[i],y[i])) return false;
10+ }
11+ return true;
12+ }
13+ return x === y;
14+ };
15+
316 var Tuple = function() {
417 var len = arguments.length;
518 var arr = new Array(len+1);
@@ -10,6 +23,15 @@ var Value = function(){
1023 return arr;
1124 };
1225
26+ var listToArray = function(list) {
27+ var arr = [];
28+ while (list[0] === "Cons") {
29+ arr.push(list[1]);
30+ list = list[2];
31+ }
32+ return arr;
33+ };
34+
1335 var properEscape = function(str) {
1436 str.replace('"', "&#34;");
1537 str.replace("&", "&#38;");
@@ -90,10 +112,21 @@ var Value = function(){
90112 curr[2] = ys;
91113 return root;
92114 };
115+
116+ var str = function(s) {
117+ var out = ["Nil"];
118+ for (var i = s.length; i--; ) {
119+ out = ["Cons", s[i], out];
120+ }
121+ return out;
122+ };
93123
94− return {show:show,
124+ return {eq:eq,
125+ str:str,
126+ show:show,
95127 Tuple:Tuple,
96128 append:append,
129+ listToArray:listToArray,
97130 toText : toText,
98131 properEscape : properEscape};
99132}();
core-js/cat-js.sh+1−1
@@ -1 +1 @@
1−cat Guid.js Value.js List.js Data.js collage/Color.js Element.js Text.js collage/Shape.js collage/Line.js runtime/Dispatcher.js runtime/Signal.js Prelude.js Everything.js > ../elm-mini.js ; ls
1+cat Guid.js foreign/JavaScript.js Value.js List.js Data.js collage/Color.js Element.js Text.js collage/Shape.js collage/Line.js runtime/Dispatcher.js runtime/Signal.js Prelude.js Everything.js > ../elm-mini.js ; ls
core-js/foreign/JavaScript.js+13−2
@@ -29,12 +29,15 @@ var Foreign = function() {
2929 return a;
3030 }
3131
32− var castJSStringToString = castJSArrayToList
32+ var castJSStringToString = castJSArrayToList;
3333 function castStringToJSString(str) {
3434 if (typeof str === "string") return str;
3535 return castListToJSArray(str).join('');
3636 }
3737
38+ function fromTuple(t) { return t.slice(1); }
39+ function toTuple(a) { return a.unshift("Tuple" + a.length); }
40+
3841 return {castJSBoolToBool:castJSBoolToBool,
3942 castBoolToJSBool:castBoolToJSBool,
4043 castJSNumberToFloat:castJSNumberToFloat,
@@ -46,7 +49,15 @@ var Foreign = function() {
4649 castJSArrayToList:castJSArrayToList,
4750 castListToJSArray:castListToJSArray,
4851 castJSStringToString:castJSStringToString,
49− castStringToJSString:castStringToJSString
52+ castStringToJSString:castStringToJSString,
53+ castTupleToJSTuple2:fromTuple,
54+ castTupleToJSTuple3:fromTuple,
55+ castTupleToJSTuple4:fromTuple,
56+ castTupleToJSTuple5:fromTuple,
57+ castJSTupleToTuple2:toTuple,
58+ castJSTupleToTuple3:toTuple,
59+ castJSTupleToTuple4:toTuple,
60+ castJSTupleToTuple5:toTuple
5061 };
5162 }();
5263 return {JavaScript:JavaScript};
core-js/runtime/Dispatcher.js+39−3
@@ -59,9 +59,46 @@ var Elm = function() {
5959 };
6060 input.kids.push(this);
6161 };
62+
63+ var dropIf = function(pred,base,input) {
64+ this.id = Guid.guid();
65+ this.value = pred(input.value) ? base : input.value;
66+ this.kids = [];
67+ this.recv = function(timestep, changed) {
68+ var chng = changed && !pred(input.value);
69+ if (chng) { this.value = input.value; }
70+ send(this.kids, timestep, chng);
71+ };
72+ input.kids.push(this);
73+ };
74+ var dropRepeats = function(input) {
75+ this.id = Guid.guid();
76+ this.value = input.value;
77+ this.kids = [];
78+ this.recv = function(timestep, changed) {
79+ var chng = changed && !eq(this.value,input.value);
80+ if (chng) { this.value = input.value; }
81+ send(this.kids, timestep, chng);
82+ };
83+ input.kids.push(this);
84+ };
85+
86+ var dropWhen = function(s1) { return function(b) { return function(s2) {
87+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
88+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
89+ return new lift(function(p){return p[1];},[dropped]); }; };
90+ };
91+
6292 return {Input: function(x) {return new input(x);},
6393 Lift: function(f,xs){return new lift(f,xs);},
64− Fold: function(f,b,x){return new fold(f,b,x);}
94+ Fold: function(f,b,x){return new fold(f,b,x);},
95+ keepIf : function(pred) { return function(base) { return function(sig) {
96+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
97+ dropIf : function(pred) { return function(base) { return function(sig) {
98+ return new dropIf(pred,base,sig); }; }; },
99+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
100+ dropWhen : dropWhen,
101+ dropRepeats : function(s) { return new dropRepeats(s);}
65102 };
66103}();
67104
@@ -109,8 +146,7 @@ var Dispatcher = function() {
109146 };
110147
111148 var initialize = function() {
112− var prog = ElmCode.hasOwnProperty("main") ? ElmCode.main : main;
113− try { program = prog(); } catch (e) { throw e; }
149+ program = ElmCode.main();
114150 if (!program.hasOwnProperty('recv')) {
115151 program = Elm.Input(program);
116152 }
core-js/runtime/Signal.js+7−1
@@ -301,6 +301,12 @@ var Signal = function() {
301301 return function(e3) { return function(e4) {
302302 return Elm.Lift(f, [e1,e2,e3,e4]); }; }; }; }; },
303303 foldp : function(f) { return function(b) { return function(e) {
304− return Elm.Fold(f,b,e); }; }; }
304+ return Elm.Fold(f,b,e); }; }; },
305+ count : function(sig){return Elm.fold(function(c){return c+1},0,sig)},
306+ keepIf : Elm.keepIf,
307+ dropIf : Elm.dropIf,
308+ keepWhen : Elm.keepWhen,
309+ dropWhen : Elm.dropWhen,
310+ dropRepeats : Elm.dropRepeats
305311 };
306312}();