Skip to content

Commit 2162bc3

Browse files
committed
abstracted complex lang and extracted double lang
1 parent 8045929 commit 2162bc3

25 files changed

+257
-162
lines changed

math-parser-spire/src/main/scala/mathParser/algebra/SpireLanguage.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package algebra
44
import spire.algebra.{Field, NRoot, Trig}
55

66
import scala.util.Try
7+
import mathParser.AbstractSyntaxTree.*
78

89
object SpireLanguage {
910

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package mathParser
2+
3+
import mathParser.boolean.{BooleanBinaryOperator, BooleanLanguage, BooleanUnitaryOperator}
4+
import mathParser.number.{Complex, ComplexLanguage, DoubleLanguage, NumberBinaryOperator, NumberUnitaryOperator}
5+
6+
object BuildIn {
7+
val booleanLanguage: Language[BooleanUnitaryOperator, BooleanBinaryOperator, Boolean, Nothing] =
8+
BooleanLanguage()
9+
10+
val doubleLanguage: Language[NumberUnitaryOperator, NumberBinaryOperator, Double, Nothing] =
11+
DoubleLanguage()
12+
13+
val complexLanguage: Language[NumberUnitaryOperator, NumberBinaryOperator, Complex, Nothing] =
14+
ComplexLanguage()
15+
}

math-parser/src/main/scala/mathParser/MathParser.scala

Lines changed: 0 additions & 12 deletions
This file was deleted.

math-parser/src/main/scala/mathParser/boolean/BooleanOperators.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package mathParser.boolean
22

3-
43
enum BooleanUnitaryOperator(val name: String):
54
case Not extends BooleanUnitaryOperator("!")
65

math-parser/src/main/scala/mathParser/complex/ComplexLanguage.scala

Lines changed: 0 additions & 23 deletions
This file was deleted.

math-parser/src/main/scala/mathParser/complex/ComplexOperators.scala

Lines changed: 0 additions & 22 deletions
This file was deleted.

math-parser/src/main/scala/mathParser/complex/ComplexOptimize.scala

Lines changed: 0 additions & 29 deletions
This file was deleted.

math-parser/src/main/scala/mathParser/complex/package.scala

Lines changed: 0 additions & 6 deletions
This file was deleted.

math-parser/src/main/scala/mathParser/complex/syntax.scala

Lines changed: 0 additions & 35 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package mathParser.complex
1+
package mathParser.number
22

33
case class Complex(real: Double, imag: Double)
44

55
object Complex {
66
val e = Complex(Math.E, 0.0)
77
val pi = Complex(Math.PI, 0.0)
88
val i = Complex(0.0, 1.0)
9+
10+
given Number[Complex] = Number.contraMap(real => Complex(real, 0.0))
911
}

math-parser/src/main/scala/mathParser/complex/ComplexEvaluate.scala renamed to math-parser/src/main/scala/mathParser/number/ComplexEvaluate.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
package mathParser.complex
1+
package mathParser.number
22

33
import mathParser.Evaluate
44

5-
import ComplexBinaryOperator.*
6-
import ComplexUnitaryOperator.*
5+
import NumberBinaryOperator.*
6+
import NumberUnitaryOperator.*
77

8-
final class ComplexEvaluate[V] extends Evaluate[ComplexUnitaryOperator, ComplexBinaryOperator, Complex, V] {
8+
final class ComplexEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Complex, V] {
99

1010
import Math._
1111

12-
def executeUnitary(uo: ComplexUnitaryOperator, a: Complex): Complex = uo match {
12+
def executeUnitary(uo: NumberUnitaryOperator, a: Complex): Complex = uo match {
1313
case Neg => complexNeg(a)
1414
case Sin => complexSin(a)
1515
case Cos => complexCos(a)
@@ -24,7 +24,7 @@ final class ComplexEvaluate[V] extends Evaluate[ComplexUnitaryOperator, ComplexB
2424
case Log => complexLog(a)
2525
}
2626

27-
def executeBinaryOperator(bo: ComplexBinaryOperator, a: Complex, b: Complex): Complex =
27+
def executeBinaryOperator(bo: NumberBinaryOperator, a: Complex, b: Complex): Complex =
2828
bo match {
2929
case Plus => complexPlus(a, b)
3030
case Minus => complexMinus(a, b)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package mathParser.number
2+
3+
import mathParser._
4+
5+
import NumberBinaryOperator.*
6+
import NumberUnitaryOperator.*
7+
import mathParser.number.NumberSyntax.*
8+
9+
object ComplexLanguage {
10+
def apply(): ComplexLanguage[Nothing] =
11+
Language.emptyLanguage
12+
.withConstants[Complex](List("e" -> Complex.e, "pi" -> Complex.pi, "i" -> Complex.i))
13+
.withBinaryOperators[NumberBinaryOperator](prefix = List.empty, infix = List(Plus, Minus, Times, Divided, Power).map(op => (op.name, op)))
14+
.withUnitaryOperators(List(Neg, Sin, Cos, Tan, Asin, Acos, Atan, Sinh, Cosh, Tanh, Exp, Log).map(op => (op.name, op)))
15+
16+
given LiteralParser[Complex] = _.toDoubleOption.map(Complex(_, 0.0))
17+
18+
given [V]: Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Complex, V] = ComplexEvaluate[V]
19+
20+
given [V]: Optimizer[NumberUnitaryOperator, NumberBinaryOperator, Complex, V] = NumberOptimizer[Complex, V]
21+
22+
given [V]: Derive[NumberUnitaryOperator, NumberBinaryOperator, Complex, V] = NumberDerive[Complex, V]
23+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package mathParser.number
2+
3+
import mathParser.Evaluate
4+
5+
final class DoubleEvaluate[V] extends Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Double, V] {
6+
7+
import Math._
8+
9+
def executeUnitary(uo: NumberUnitaryOperator, a: Double): Double = uo match {
10+
case Neg => -a
11+
case Sin => sin(a)
12+
case Cos => cos(a)
13+
case Tan => tan(a)
14+
case Asin => asin(a)
15+
case Acos => acos(a)
16+
case Atan => atan(a)
17+
case Sinh => sinh(a)
18+
case Cosh => cosh(a)
19+
case Tanh => tanh(a)
20+
case Exp => exp(a)
21+
case Log => log(a)
22+
}
23+
24+
def executeBinaryOperator(bo: NumberBinaryOperator, a: Double, b: Double): Double =
25+
bo match {
26+
case Plus => a+b
27+
case Minus => a - b
28+
case Times => a * b
29+
case Divided => a / b
30+
case Power => pow(a, b)
31+
}
32+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package mathParser.number
2+
3+
import mathParser._
4+
import mathParser.number.NumberSyntax
5+
6+
object DoubleLanguage {
7+
def apply(): Language[NumberUnitaryOperator, NumberBinaryOperator, Double, Nothing] =
8+
Language.emptyLanguage
9+
.withConstants[Double](List("e" -> Math.E, "pi" -> Math.PI))
10+
.withBinaryOperators[NumberBinaryOperator](prefix = List.empty, infix = List(Plus, Minus, Times, Divided, Power).map(op => (op.name, op)))
11+
.withUnitaryOperators(List(Neg, Sin, Cos, Tan, Asin, Acos, Atan, Sinh, Cosh, Tanh, Exp, Log).map(op => (op.name, op)))
12+
13+
given LiteralParser[Double] = _.toDoubleOption
14+
15+
given [V]: Evaluate[NumberUnitaryOperator, NumberBinaryOperator, Double, V] = DoubleEvaluate[V]
16+
17+
given [V]: Optimizer[NumberUnitaryOperator, NumberBinaryOperator, Double, V] = NumberOptimizer[Double, V]
18+
19+
given [V]: Derive[NumberUnitaryOperator, NumberBinaryOperator, Double, V] = NumberDerive[Double, V]
20+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package mathParser.number
2+
3+
trait Number[S]:
4+
def zero: S
5+
def one: S
6+
def two: S
7+
def oneHalf: S
8+
9+
object Number:
10+
def zero[S](using number: Number[S]): S = number.zero
11+
def one[S](using number: Number[S]): S = number.one
12+
def two[S](using number: Number[S]): S = number.two
13+
def oneHalf[S](using number: Number[S]):S = number.oneHalf
14+
15+
def contraMap[A, B](f: A => B)(using number: Number[A]): Number[B] =
16+
new Number[B]:
17+
def zero = f(number.zero)
18+
def one = f(number.one)
19+
def two = f(number.two)
20+
def oneHalf = f(number.oneHalf)
21+
22+
given Number[Double] = new Number[Double]:
23+
def zero = 0.0
24+
def one = 1.0
25+
def two = 2.0
26+
def oneHalf = 0.5

math-parser/src/main/scala/mathParser/complex/ComplexDerive.scala renamed to math-parser/src/main/scala/mathParser/number/NumberDerive.scala

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
package mathParser.complex
1+
package mathParser.number
22

3-
import mathParser.{Derive}
4-
import mathParser.complex.ComplexUnitaryOperator.*
5-
import mathParser.complex.ComplexBinaryOperator.*
6-
import mathParser.complex.Syntax.*
7-
import mathParser.*
3+
import mathParser.{AbstractSyntaxTree, Derive}
4+
import mathParser.AbstractSyntaxTree.*
5+
import mathParser.number.NumberUnitaryOperator
6+
import mathParser.number.NumberBinaryOperator
7+
import mathParser.number.NumberSyntax.*
88

9-
class ComplexDerive[V] extends Derive[ComplexUnitaryOperator, ComplexBinaryOperator, Complex, V] {
10-
def derive(term: ComplexNode[V])(variable: V): ComplexNode[V] = {
11-
def derive(term: ComplexNode[V]): ComplexNode[V] = term match {
9+
class NumberDerive[S: Number, V] extends Derive[NumberUnitaryOperator, NumberBinaryOperator, S, V] {
10+
def derive(term: AbstractSyntaxTree[NumberUnitaryOperator, NumberBinaryOperator, S, V])(variable: V): AbstractSyntaxTree[NumberUnitaryOperator, NumberBinaryOperator, S, V] = {
11+
val zero = ConstantNode[NumberUnitaryOperator, NumberBinaryOperator, S, V](Number.zero[S])
12+
val one = ConstantNode[NumberUnitaryOperator, NumberBinaryOperator, S, V](Number.one[S])
13+
14+
def derive(term: AbstractSyntaxTree[NumberUnitaryOperator, NumberBinaryOperator, S, V]): AbstractSyntaxTree[NumberUnitaryOperator, NumberBinaryOperator, S, V] = term match {
1215
case VariableNode(`variable`) => one
1316
case VariableNode(_) | ConstantNode(_) => zero
1417
case UnitaryNode(op, f) =>
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package mathParser.number
2+
3+
enum NumberUnitaryOperator(val name: String):
4+
case Neg extends NumberUnitaryOperator("-")
5+
case Sin extends NumberUnitaryOperator("sin")
6+
case Cos extends NumberUnitaryOperator("cos")
7+
case Tan extends NumberUnitaryOperator("tan")
8+
case Asin extends NumberUnitaryOperator("asin")
9+
case Acos extends NumberUnitaryOperator("acos")
10+
case Atan extends NumberUnitaryOperator("atan")
11+
case Sinh extends NumberUnitaryOperator("sinh")
12+
case Cosh extends NumberUnitaryOperator("cosh")
13+
case Tanh extends NumberUnitaryOperator("tanh")
14+
case Exp extends NumberUnitaryOperator("exp")
15+
case Log extends NumberUnitaryOperator("log")
16+
17+
enum NumberBinaryOperator(val name: String):
18+
case Plus extends NumberBinaryOperator("+")
19+
case Minus extends NumberBinaryOperator("-")
20+
case Times extends NumberBinaryOperator("*")
21+
case Divided extends NumberBinaryOperator("/")
22+
case Power extends NumberBinaryOperator("^")
23+
24+
export NumberBinaryOperator.*
25+
export NumberUnitaryOperator.*

0 commit comments

Comments
 (0)