@@ -143,29 +143,37 @@ function croppedImage(elem, w, h, src) {
143 return e;
143 return e;
146−function goIn(e) { e.style.position = 'absolute'; return e; }
146+function goOut(e) { e.style.position = 'absolute'; return e; }
147function goDown(e) { return e }
147function goDown(e) { return e }
148function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }
148function goRight(e) { e.style.styleFloat = e.style.cssFloat = "left"; return e; }
149−function flowWith(f, array) {
150− var container = newElement('div');
151− if (f == goIn) container.style.pointerEvents = 'none';
153− for (var i = array.length; i--; ) {
150+var directionTable = {
154− container.appendChild(f(render(array[i])));
151+ DUp : goDown,
156− return container;
158+function needsReversal(dir) {
159+ return dir == 'DUp' || dir == 'DLeft' || dir == 'DIn';
159function flow(dir,elist) {
162function flow(dir,elist) {
160 var array = fromList(elist);
163 var array = fromList(elist);
161− switch(dir.ctor) {
164+ var container = newElement('div');
162− case "DDown": array.reverse();
165+ var goDir = directionTable[dir];
163− case "DUp": return flowWith(goDown,array);
166+ if (goDir == goOut) {
164− case "DRight": array.reverse();
167+ container.style.pointerEvents = 'none';
165− case "DLeft": return flowWith(goRight,array);
166− case "DOut": array.reverse();
167− case "DIn": return flowWith(goIn,array);
169+ if (needsReversal(dir)) {
172+ var len = array.length;
173+ for (var i = 0; i < len; ++i) {
174+ container.appendChild(goDir(render(array[i])));
171function toPos(pos) {
179function toPos(pos) {
@@ -245,7 +253,7 @@ function makeElement(e) {
245 var elem = e.element;
253 var elem = e.element;
246 switch(elem.ctor) {
254 switch(elem.ctor) {
247 case 'Image': return image(e.props, elem);
255 case 'Image': return image(e.props, elem);
248− case 'Flow': return flow(elem._0, elem._1);
256+ case 'Flow': return flow(elem._0.ctor, elem._1);
249 case 'Container': return container(elem._0, elem._1);
257 case 'Container': return container(elem._0, elem._1);
250 case 'Spacer': return newElement('div');
258 case 'Spacer': return newElement('div');
251 case 'RawHtml': return rawHtml(elem);
259 case 'RawHtml': return rawHtml(elem);
@@ -321,14 +329,12 @@ function update(node, curr, next) {
321 return true;
329 return true;
323 var currs = fromList(currE._1);
331 var currs = fromList(currE._1);
324− var goDir = function(x) { return x; };
325− switch(nextE._0.ctor) {
332+ var dir = nextE._0.ctor;
326− case "DDown": case "DUp": goDir = goDown; break;
333+ var goDir = directionTable[dir];
327− case "DRight": case "DLeft": goDir = goRight; break;
334+ var toReverse = needsReversal(dir);
328− case "DOut": case "DIn": goDir = goIn; break;
335+ var len = kids.length;
330− for (var i = kids.length; i-- ;) {
336+ for (var i = len; i-- ;) {
331− update(kids[i],currs[i],nexts[i]);
337+ update(kids[toReverse ? len - i - 1 : i],currs[i],nexts[i]);
332 goDir(kids[i]);
338 goDir(kids[i]);