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

#513 - Time Units #521

Merged
merged 1 commit into from
Mar 26, 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 @@ -125,6 +125,10 @@ public virtual TResult Analyze(Mass exp, TContext context)
public virtual TResult Analyze(Length exp, TContext context)
=> Analyze(exp as IExpression, context);

/// <inheritdoc />
public virtual TResult Analyze(Time 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 @@ -124,6 +124,10 @@ public virtual TResult Analyze(Mass exp)
public virtual TResult Analyze(Length exp)
=> Analyze(exp as IExpression);

/// <inheritdoc />
public virtual TResult Analyze(Time 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 @@ -250,6 +250,14 @@ public override IExpression Analyze(Length exp, DifferentiatorContext context)
return Number.Zero;
}

/// <inheritdoc />
public override IExpression Analyze(Time 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 @@ -169,6 +169,10 @@ public virtual string Analyze(Mass exp)
public virtual string Analyze(Length exp)
=> exp.Value.ToString();

/// <inheritdoc />
public virtual string Analyze(Time 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 @@ -228,6 +228,14 @@ public interface IAnalyzer<out TResult, in TContext>
/// <returns>The result of analysis.</returns>
TResult Analyze(Length 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(Time 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 @@ -200,6 +200,13 @@ public interface IAnalyzer<out TResult>
/// <returns>The result of analysis.</returns>
TResult Analyze(Length exp);

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

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

(Number left, Time right)
=> (left.Value + right.Value).AsExpression(),
(Time left, Number right)
=> (left.Value + right.Value).AsExpression(),
(Time left, Time 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 @@ -332,6 +339,8 @@ public override IExpression Analyze(Div exp)
=> (left.Value / right.Value).AsExpression(),
(Length left, Number right)
=> (left.Value / right.Value).AsExpression(),
(Time left, Number right)
=> (left.Value / right.Value).AsExpression(),

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

(Number left, Time right)
=> (left.Value * right.Value).AsExpression(),
(Time 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 @@ -664,6 +678,7 @@ public override IExpression Analyze(ToNumber exp)
Temperature(var temperature) => new Number(temperature.Value),
Mass(var mass) => new Number(mass.Value),
Length(var length) => new Number(length.Value),
Time(var time) => new Number(time.Value),
var arg when IsChanged(exp, arg) => new ToNumber(arg),
_ => exp,
};
Expand Down Expand Up @@ -793,6 +808,13 @@ public override IExpression Analyze(Sub exp)
(Length left, Length right)
=> (left.Value - right.Value).AsExpression(),

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

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

/// <summary>
/// The expression returns a time number.
/// </summary>
TimeNumber = 1 << 13,

/// <summary>
/// The expression returns a number or a complex number.
/// </summary>
Expand All @@ -101,12 +106,10 @@ public enum ResultTypes
/// </summary>
NumberOrVectorOrMatrix = Number | Vector | Matrix,

// TODO: remove?

/// <summary>
/// The expression returns any type of number.
/// </summary>
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber | LengthNumber,
Numbers = Number | AngleNumber | PowerNumber | TemperatureNumber | MassNumber | LengthNumber | TimeNumber,

/// <summary>
/// The expression returns a number or a angle number or a complex number or a vector.
Expand Down
35 changes: 33 additions & 2 deletions xFunc.Maths/Analyzers/TypeAnalyzers/TypeAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ public virtual ResultTypes Analyze(Abs exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => ResultTypes.NumbersOrComplexOrVector.ThrowFor(result),
};
}
Expand Down Expand Up @@ -357,6 +358,11 @@ public virtual ResultTypes Analyze(Add exp)
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
=> ResultTypes.LengthNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -402,6 +408,7 @@ public virtual ResultTypes Analyze(Ceil exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => ResultTypes.Numbers.ThrowFor(result),
};
}
Expand Down Expand Up @@ -464,6 +471,9 @@ public virtual ResultTypes Analyze(Div exp)
(ResultTypes.LengthNumber, ResultTypes.Number)
=> ResultTypes.LengthNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -526,6 +536,7 @@ public virtual ResultTypes Analyze(Floor exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -547,6 +558,7 @@ public virtual ResultTypes Analyze(Trunc exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand All @@ -568,6 +580,7 @@ public virtual ResultTypes Analyze(Frac exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => ResultTypes.NumberOrAngle.ThrowFor(result),
};
}
Expand Down Expand Up @@ -744,6 +757,10 @@ public virtual ResultTypes Analyze(Mul exp)
(ResultTypes.LengthNumber, ResultTypes.Number)
=> ResultTypes.LengthNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -801,6 +818,10 @@ public virtual ResultTypes Analyze(Mass exp)
public virtual ResultTypes Analyze(Length exp)
=> CheckArgument(exp, ResultTypes.LengthNumber);

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

/// <inheritdoc />
public virtual ResultTypes Analyze(ToDegree exp)
=> AngleConversion(exp);
Expand Down Expand Up @@ -828,7 +849,8 @@ ResultTypes.AngleNumber or
ResultTypes.PowerNumber or
ResultTypes.TemperatureNumber or
ResultTypes.MassNumber or
ResultTypes.LengthNumber
ResultTypes.LengthNumber or
ResultTypes.TimeNumber
=> ResultTypes.Number,
_ => ResultTypes.AngleNumber.ThrowFor(result),
};
Expand Down Expand Up @@ -908,6 +930,7 @@ public virtual ResultTypes Analyze(Round exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
_ => throw new DifferentParameterTypeMismatchException(
ResultTypes.Undefined | ResultTypes.Numbers,
number,
Expand Down Expand Up @@ -971,6 +994,11 @@ public virtual ResultTypes Analyze(Sub exp)
(ResultTypes.LengthNumber, ResultTypes.LengthNumber)
=> ResultTypes.LengthNumber,

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

(ResultTypes.Number, ResultTypes.ComplexNumber) or
(ResultTypes.ComplexNumber, ResultTypes.Number) or
(ResultTypes.ComplexNumber, ResultTypes.ComplexNumber)
Expand Down Expand Up @@ -1012,6 +1040,7 @@ public virtual ResultTypes Analyze(UnaryMinus exp)
ResultTypes.TemperatureNumber => ResultTypes.TemperatureNumber,
ResultTypes.MassNumber => ResultTypes.MassNumber,
ResultTypes.LengthNumber => ResultTypes.LengthNumber,
ResultTypes.TimeNumber => ResultTypes.TimeNumber,
ResultTypes.ComplexNumber => ResultTypes.ComplexNumber,
_ => ResultTypes.NumberOrComplex.ThrowFor(result),
};
Expand Down Expand Up @@ -1048,7 +1077,9 @@ ResultTypes.Number or
ResultTypes.AngleNumber or
ResultTypes.PowerNumber or
ResultTypes.TemperatureNumber or
ResultTypes.MassNumber => ResultTypes.Number,
ResultTypes.MassNumber or
ResultTypes.LengthNumber or
ResultTypes.TimeNumber => ResultTypes.Number,

_ => ResultTypes.Numbers.ThrowFor(result),
};
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 @@ -45,6 +45,7 @@ public override object Execute(ExpressionParameters? parameters)
TemperatureValue temperature => TemperatureValue.Abs(temperature),
MassValue mass => MassValue.Abs(mass),
LengthValue length => LengthValue.Abs(length),
TimeValue time => TimeValue.Abs(time),
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 @@ -63,6 +63,10 @@ public override object Execute(ExpressionParameters? parameters)
(LengthValue left, NumberValue right) => left + right,
(LengthValue left, LengthValue right) => left + right,

(NumberValue left, TimeValue right) => left + right,
(TimeValue left, NumberValue right) => left + right,
(TimeValue left, TimeValue 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 @@ -43,6 +43,7 @@ public override object Execute(ExpressionParameters? parameters)
TemperatureValue temperature => TemperatureValue.Ceiling(temperature),
MassValue mass => MassValue.Ceiling(mass),
LengthValue length => LengthValue.Ceiling(length),
TimeValue time => TimeValue.Ceiling(time),
_ => throw new ResultIsNotSupportedException(this, result),
};
}
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 @@ -46,6 +46,7 @@ public override object Execute(ExpressionParameters? parameters)
(TemperatureValue left, NumberValue right) => left / right,
(MassValue left, NumberValue right) => left / right,
(LengthValue left, NumberValue right) => left / right,
(TimeValue 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 @@ -43,6 +43,7 @@ public override object Execute(ExpressionParameters? parameters)
TemperatureValue temperature => TemperatureValue.Floor(temperature),
MassValue mass => MassValue.Floor(mass),
LengthValue length => LengthValue.Floor(length),
TimeValue time => TimeValue.Floor(time),
_ => 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 @@ -43,6 +43,7 @@ public override object Execute(ExpressionParameters? parameters)
TemperatureValue temperature => TemperatureValue.Frac(temperature),
MassValue mass => MassValue.Frac(mass),
LengthValue length => LengthValue.Frac(length),
TimeValue time => TimeValue.Frac(time),
_ => 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 @@ -57,6 +57,9 @@ public override object Execute(ExpressionParameters? parameters)
(NumberValue left, LengthValue right) => left * right,
(LengthValue left, NumberValue right) => left * right,

(NumberValue left, TimeValue right) => left * right,
(TimeValue 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