code: function(and1, and2) {
  			var union1 = set.union(and1, and2.values[0]);
  			var union2 = set.union(and1, and2.values[1]);
  
  			if (isAndOrOr(union1) || isAndOrOr(union2)) {
  				// try the other direction
  				union1 = set.union(and2, and1.values[0]);
  				union2 = set.union(and2, and1.values[1]);
  			}
  			if (isAndOrOr(union1) || isAndOrOr(union2)) {
  				return new is.Or([and1, and2]);
  			} else {
  				return set.intersection(union1, union2);
  			}
  
  			/*
  			var combo1 = [
  					set.union(and1.values[0], and2.values[0]),
  					set.union(and1.values[1], and2.values[1])
  				],
  				combo2 = [
  					set.union(and1.values[0], and2.values[1]),
  					set.union(and1.values[1], and2.values[0])
  				];
  			if(combo1.every(isUniversal)) {
  				return set.intersection.apply(set, combo2);
  			}
  			if(combo2.every(isUniversal)) {
  				return set.intersection.apply(set, combo1);
  			}
  			return new is.Or([and1, and2]);*/
  		}
docs: (a n b) U (c n d) => (a U c) n (b U d)? union both ways ... if one is unviersal, the other is the result. (a ∩ b) ∪ (c ∩ d) where Z = (a ∩ b) -> Z ∪ (c ∩ d) -> (Z ∪ c) ∩ (Z ∪ d) -> ((a ∩ b) ∪ c) ∪ ((a ∩ b) ∪ d)