Skip to content

Commit

Permalink
#513 - Time Units
Browse files Browse the repository at this point in the history
  • Loading branch information
sys27 committed Mar 25, 2022
1 parent 1a74ba7 commit e562d20
Show file tree
Hide file tree
Showing 70 changed files with 2,563 additions and 559 deletions.
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

0 comments on commit e562d20

Please sign in to comment.