flutter/packages/cassowary/lib/variable.dart

74 lines
1.9 KiB
Dart

// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of cassowary;
class Variable extends EquationMember {
double value = 0.0;
Variable(this.value);
Expression _asExpression() => new Expression([new Term(this, 1.0)], 0.0);
Constraint operator >=(EquationMember m) => _asExpression() >= m;
Constraint operator <=(EquationMember m) => _asExpression() <= m;
operator ==(EquationMember m) => _asExpression() == m;
Expression operator +(EquationMember m) {
if (m is ConstantMember) {
return new Expression([new Term(this, 1.0)], m.value);
}
if (m is Variable) {
return new Expression([new Term(this, 1.0), new Term(m, 1.0)], 0.0);
}
if (m is Term) {
return new Expression([new Term(this, 1.0), m], 0.0);
}
if (m is Expression) {
return new Expression(
new List.from(m.terms)..insert(0, new Term(this, 1.0)), m.constant);
}
assert(false);
return null;
}
Expression operator -(EquationMember m) {
if (m is ConstantMember) {
return new Expression([new Term(this, 1.0)], -m.value);
}
if (m is Variable) {
return new Expression([new Term(this, 1.0), new Term(m, -1.0)], 0.0);
}
if (m is Term) {
return new Expression(
[new Term(this, 1.0), new Term(m.variable, -m.coefficient)], 0.0);
}
if (m is Expression) {
var negatedTerms = m.terms.fold(new List<Term>(),
(list, t) => list..add(new Term(t.variable, -t.coefficient)));
negatedTerms.insert(0, new Term(this, 1.0));
return new Expression(negatedTerms, -m.constant);
}
assert(false);
return null;
}
EquationMember operator *(double m) {
return new Term(this, m);
}
EquationMember operator /(double m) {
return new Term(this, 1.0 / m);
}
}