@@ -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 }