operator + method
The blend operator.
Blending assigns varsets to a same dimension in order. The meaning of the variables respectively in that dimension is determined by geometry type.
Implementation
Varset operator +(Varset other) {
// It creates a polynomial:
//
// - [form], append all right form terms to the left ones, normalizes the form,
// and deduplicates.
// - [nested], only for distributivity, if nesteds are same, uses that nested,
// makes sure two nesters are single, appends the two single nesters, normalizes,
// and deduplicates; if nested are different, makes sure two nesters are same
// and uses that nesters, appends two nesteds, nomalizes and deduplicaates.
// - [nesters], see in [nested].
final AlgForm formRst = (<AlgTerm>[...form, ...other.form].._normalize())
.collectionItemDeduplicate();
AlgForm? nestedRst;
List<AlgForm> nestersRst = [];
if (nested == null && other.nested == null) {
// Does nothing.
} else if (deepCollectionEquals(nested, other.nested)) {
// Right distributivity: x / y + x / z = x / (y + z).
nestedRst = nested;
final leftNester = nesters.single;
final rightNester = other.nesters.single;
nestersRst = [
([...leftNester, ...rightNester].._normalize())
.collectionItemDeduplicate()
];
} else {
// nested != other.nested
final leftNester = nesters.single;
final rightNester = other.nesters.single;
if (deepCollectionEquals(leftNester, rightNester)) {
// Left distributivity: x / z + y / z = (x + y) / z.
nestedRst = ([...nested!, ...other.nested!].._normalize())
.collectionItemDeduplicate();
nestersRst = nesters;
} else {
throw ArgumentError(
'Two nested operands without distributivity can not blend');
}
}
return Varset._create(
formRst,
nestedRst,
nestersRst,
);
}