Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#514 - Length Units. #519

Merged
merged 1 commit into from
Mar 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Analyzer{TResult,TContext}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ public virtual TResult Analyze(Temperature exp, TContext context)
public virtual TResult Analyze(Mass exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(Length exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(ToDegree exp, TContext context)
=> Analyze(exp as IExpression, context);
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Analyzer{TResult}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ public virtual TResult Analyze(Temperature exp)
public virtual TResult Analyze(Mass exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(Length exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(ToDegree exp)
=> Analyze(exp as IExpression);
Expand Down
8 changes: 8 additions & 0 deletions xFunc.Maths/Analyzers/Differentiator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,14 @@ public override IExpression Analyze(Mass exp, DifferentiatorContext context)
return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Length exp, DifferentiatorContext context)
{
ValidateArguments(exp, context);

return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Pow exp, DifferentiatorContext context)
{
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Analyzers/Formatters/CommonFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,10 @@ public virtual string Analyze(Temperature exp)
public virtual string Analyze(Mass exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(Length exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(ToDegree exp)
=> ToString(exp, "todegree({0})");
Expand Down
8 changes: 8 additions & 0 deletions xFunc.Maths/Analyzers/IAnalyzer{TResult,TContext}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,14 @@ public interface IAnalyzer<out TResult, in TContext>
/// <returns>The result of analysis.</returns>
TResult Analyze(Mass exp, TContext context);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
/// <param name="exp">The expression.</param>
/// <param name="context">The context.</param>
/// <returns>The result of analysis.</returns>
TResult Analyze(Length exp, TContext context);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
7 changes: 7 additions & 0 deletions xFunc.Maths/Analyzers/IAnalyzer{TResult}.cs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,13 @@ public interface IAnalyzer<out TResult>
/// <returns>The result of analysis.</returns>
TResult Analyze(Mass exp);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
/// <param name="exp">The expression.</param>
/// <returns>The result of analysis.</returns>
TResult Analyze(Length exp);

/// <summary>
/// Analyzes the specified expression.
/// </summary>
Expand Down
25 changes: 25 additions & 0 deletions xFunc.Maths/Analyzers/Simplifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,13 @@ public override IExpression Analyze(Add exp)
(Mass left, Mass right)
=> (left.Value + right.Value).AsExpression(),

(Number left, Length right)
=> (left.Value + right.Value).AsExpression(),
(Length left, Number right)
=> (left.Value + right.Value).AsExpression(),
(Length left, Length right)
=> (left.Value + right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
=> new Mul(Number.Two, left),
Expand Down Expand Up @@ -323,6 +330,8 @@ public override IExpression Analyze(Div exp)
=> (left.Value / right.Value).AsExpression(),
(Mass left, Number right)
=> (left.Value / right.Value).AsExpression(),
(Length left, Number right)
=> (left.Value / right.Value).AsExpression(),

// x / x
(Variable left, Variable right) when left.Equals(right)
Expand Down Expand Up @@ -520,6 +529,11 @@ public override IExpression Analyze(Mul exp)
(Mass left, Number right)
=> (left.Value * right.Value).AsExpression(),

(Number left, Length right)
=> (left.Value * right.Value).AsExpression(),
(Length left, Number right)
=> (left.Value * right.Value).AsExpression(),

// x * -y
(var left, UnaryMinus minus)
=> new UnaryMinus(new Mul(left, minus.Argument)),
Expand Down Expand Up @@ -646,6 +660,10 @@ public override IExpression Analyze(ToNumber exp)
return argument switch
{
Angle(var angle) => new Number(angle.Angle),
Power(var power) => new Number(power.Value),
Temperature(var temperature) => new Number(temperature.Value),
Mass(var mass) => new Number(mass.Value),
Length(var length) => new Number(length.Value),
var arg when IsChanged(exp, arg) => new ToNumber(arg),
_ => exp,
};
Expand Down Expand Up @@ -768,6 +786,13 @@ public override IExpression Analyze(Sub exp)
(Mass left, Mass right)
=> (left.Value - right.Value).AsExpression(),

(Number left, Length right)
=> (left.Value - right.Value).AsExpression(),
(Length left, Number right)
=> (left.Value - right.Value).AsExpression(),
(Length left, Length right)
=> (left.Value - right.Value).AsExpression(),

// x + x
(Variable left, Variable right) when left.Name == right.Name
=> Number.Zero,
Expand Down
7 changes: 6 additions & 1 deletion xFunc.Maths/Analyzers/TypeAnalyzers/ResultTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ public enum ResultTypes
/// </summary>
MassNumber = 1 << 11,

/// <summary>
/// The expression returns a length number.
/// </summary>
LengthNumber = 1 << 12,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
Expand All @@ -101,7 +106,7 @@ public enum ResultTypes
/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber,
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber | LengthNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
Expand Down
32 changes: 31 additions & 1 deletion xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ public virtual ResultTypes Analyze(Abs exp)
ResultTypes.AngleNumber => ResultTypes.AngleNumber,
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
};
Expand Down Expand Up @@ -351,6 +352,11 @@ public virtual ResultTypes Analyze(Add exp)
(ResultTypes.MassNumber, ResultTypes.MassNumber)
=> ResultTypes.MassNumber,

(ResultTypes.Number, ResultTypes.LengthNumber) or
(ResultTypes.LengthNumber, ResultTypes.Number) or
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
=> ResultTypes.LengthNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -395,6 +401,7 @@ public virtual ResultTypes Analyze(Ceil exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}
Expand Down Expand Up @@ -454,6 +461,9 @@ public virtual ResultTypes Analyze(Div exp)
(ResultTypes.MassNumber, ResultTypes.Number)
=> ResultTypes.MassNumber,

(ResultTypes.LengthNumber, ResultTypes.Number)
=> ResultTypes.LengthNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -515,6 +525,7 @@ public virtual ResultTypes Analyze(Floor exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -535,6 +546,7 @@ public virtual ResultTypes Analyze(Trunc exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -555,6 +567,7 @@ public virtual ResultTypes Analyze(Frac exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand Down Expand Up @@ -727,6 +740,10 @@ public virtual ResultTypes Analyze(Mul exp)
(ResultTypes.MassNumber, ResultTypes.Number)
=> ResultTypes.MassNumber,

(ResultTypes.Number, ResultTypes.LengthNumber) or
(ResultTypes.LengthNumber, ResultTypes.Number)
=> ResultTypes.LengthNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -780,6 +797,10 @@ public virtual ResultTypes Analyze(Temperature exp)
public virtual ResultTypes Analyze(Mass exp)
=> CheckArgument(exp, ResultTypes.MassNumber);

/// <inheritdoc />
public virtual ResultTypes Analyze(Length exp)
=> CheckArgument(exp, ResultTypes.LengthNumber);

/// <inheritdoc />
public virtual ResultTypes Analyze(ToDegree exp)
=> AngleConversion(exp);
Expand All @@ -806,7 +827,8 @@ ResultTypes.Undefined or
ResultTypes.AngleNumber or
ResultTypes.PowerNumber or
ResultTypes.TemperatureNumber or
ResultTypes.MassNumber
ResultTypes.MassNumber or
ResultTypes.LengthNumber
=> ResultTypes.Number,
_ => ResultTypes.AngleNumber.ThrowFor(result),
};
Expand Down Expand Up @@ -885,6 +907,7 @@ public virtual ResultTypes Analyze(Round exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
_ => throw new DifferentParameterTypeMismatchException(
ResultTypes.Undefined | ResultTypes.Numbers,
number,
Expand Down Expand Up @@ -943,6 +966,11 @@ public virtual ResultTypes Analyze(Sub exp)
(ResultTypes.MassNumber, ResultTypes.MassNumber)
=> ResultTypes.MassNumber,

(ResultTypes.Number, ResultTypes.LengthNumber) or
(ResultTypes.LengthNumber, ResultTypes.Number) or
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
=> ResultTypes.LengthNumber,

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -983,6 +1011,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
};
Expand Down Expand Up @@ -1057,6 +1086,7 @@ ResultTypes.Undefined or
ResultTypes.PowerNumber => ResultTypes.PowerNumber,
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,

_ => ResultTypes.Numbers.ThrowFor(valueResult),
};
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Abs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public override object Execute(ExpressionParameters? parameters)
PowerValue power => PowerValue.Abs(power),
TemperatureValue temperature => TemperatureValue.Abs(temperature),
MassValue mass => MassValue.Abs(mass),
LengthValue length => LengthValue.Abs(length),
Complex complex => Complex.Abs(complex),
Vector vector => vector.Abs(parameters),
_ => throw new ResultIsNotSupportedException(this, result),
Expand Down
4 changes: 4 additions & 0 deletions xFunc.Maths/Expressions/Add.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ public override object Execute(ExpressionParameters? parameters)
(MassValue left, NumberValue right) => left + right,
(MassValue left, MassValue right) => left + right,

(NumberValue left, LengthValue right) => left + right,
(LengthValue left, NumberValue right) => left + right,
(LengthValue left, LengthValue right) => left + right,

(NumberValue left, Complex right) => left + right,
(Complex left, NumberValue right) => left + right,
(Complex left, Complex right) => left + right,
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Ceil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
PowerValue power => PowerValue.Ceiling(power),
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
MassValue mass => MassValue.Ceiling(mass),
LengthValue length => LengthValue.Ceiling(length),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
11 changes: 11 additions & 0 deletions xFunc.Maths/Expressions/Collections/ParameterValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ public ParameterValue(MassValue value)
{
}

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(LengthValue value)
: this(value as object)
{
}

/// <inheritdoc cref="ParameterValue(object)"/>
public ParameterValue(Complex value)
: this(value as object)
Expand Down Expand Up @@ -93,6 +99,7 @@ or AngleValue
or PowerValue
or TemperatureValue
or MassValue
or LengthValue
or Complex
or bool
or Vector
Expand Down Expand Up @@ -131,6 +138,10 @@ or Matrix
public static implicit operator ParameterValue(MassValue value)
=> new ParameterValue(value);

/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
public static implicit operator ParameterValue(LengthValue value)
=> new ParameterValue(value);

/// <inheritdoc cref="ParameterValue.op_Implicit(double)"/>
public static implicit operator ParameterValue(Complex value)
=> new ParameterValue(value);
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Div.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
(PowerValue left, NumberValue right) => left / right,
(TemperatureValue left, NumberValue right) => left / right,
(MassValue left, NumberValue right) => left / right,
(LengthValue left, NumberValue right) => left / right,

(NumberValue left, Complex right) => left / right,
(Complex left, NumberValue right) => left / right,
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Floor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
PowerValue power => PowerValue.Floor(power),
TemperatureValue temperature => TemperatureValue.Floor(temperature),
MassValue mass => MassValue.Floor(mass),
LengthValue length => LengthValue.Floor(length),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
1 change: 1 addition & 0 deletions xFunc.Maths/Expressions/Frac.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public override object Execute(ExpressionParameters? parameters)
PowerValue power => PowerValue.Frac(power),
TemperatureValue temperature => TemperatureValue.Frac(temperature),
MassValue mass => MassValue.Frac(mass),
LengthValue length => LengthValue.Frac(length),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
Expand Down
3 changes: 3 additions & 0 deletions xFunc.Maths/Expressions/Mul.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public override object Execute(ExpressionParameters? parameters)
(NumberValue left, MassValue right) => left * right,
(MassValue left, NumberValue right) => left * right,

(NumberValue left, LengthValue right) => left * right,
(LengthValue left, NumberValue right) => left * right,

(NumberValue left, Complex right) => left * right,
(Complex left, NumberValue right) => left * right,
(Complex left, Complex right) => left * right,
Expand Down