min/max now always reduce compatible terms.

This commit is contained in:
Kevin Gillette
2013-06-14 18:15:15 -06:00
committed by Luke Page
parent 6df4e48976
commit 54a5f74c09
3 changed files with 29 additions and 24 deletions

View File

@@ -272,28 +272,35 @@ tree.functions = {
case 0: throw { type: "Argument", message: "one or more arguments required" };
case 1: return args[0];
}
var isMin = name == 'min';
function f (a, b) {
if(!(a instanceof tree.Dimension && b instanceof tree.Dimension)) {
return null;
var i, j, cur, ucur, uref, u,
isMin = name == 'min',
order = [], // elems only contains original argument values.
values = {}; // key is the unit.toString() for unified tree.Dimension values,
// value is the index into the order array.
for(i = 0; i < args.length; i++) {
cur = args[i];
if(!(cur instanceof tree.Dimension)) {
order.push(cur);
continue;
}
var ua = a.unify();
var ub = b.unify();
if(ua.unit.compare(ub.unit) != 0) {
return null;
ucur = cur.unify();
u = ucur.unit.toString();
j = values[u];
if(j === undefined) {
values[u] = order.length;
order.push(cur);
continue;
}
var val = ua.compare(ub);
if(isMin && val > 0 || !isMin && val < 0) {
return b;
uref = order[j].unify();
if(isMin && ucur.value < uref.value || !isMin && ucur.value > uref.value) {
order[j] = cur;
}
return a;
}
var val = args.reduce(f);
if(val !== null) {
return val;
if(order.length == 1) {
return order[0];
}
return new(tree.Anonymous)(name +
"(" + args.map(function (a) { return a.toCSS(); }).join(', ') + ")");
"(" + order.map(function (a) { return a.toCSS(); }).join(', ') + ")");
},
min: function () {
return this._minmax('min', arguments);