aboutsummaryrefslogtreecommitdiff
path: root/src/Builtin.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-09 20:09:43 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-09 20:09:43 +0200
commite8e86cea2bffe23961f0a1bea8ee770343894858 (patch)
tree2223ba98108ea98b86be4ee104a682109c56b74d /src/Builtin.hs
parent9a4cf15fc0e724e6bc93c6530b47ca45836da5ba (diff)
downloadcomputorv2-e8e86cea2bffe23961f0a1bea8ee770343894858.tar.gz
computorv2-e8e86cea2bffe23961f0a1bea8ee770343894858.tar.bz2
computorv2-e8e86cea2bffe23961f0a1bea8ee770343894858.zip
builtin cleaning
Diffstat (limited to 'src/Builtin.hs')
-rw-r--r--src/Builtin.hs66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/Builtin.hs b/src/Builtin.hs
new file mode 100644
index 0000000..8287d5a
--- /dev/null
+++ b/src/Builtin.hs
@@ -0,0 +1,66 @@
+module Builtin where
+
+
+builtinAdd :: Expr -> Expr -> Maybe Expr
+
+builtinAdd (Rational a) (Rational b) = Just $ Rational (a + b)
+builtinAdd (Rational a) (Imaginary b) = Just $ Complex a b
+builtinAdd (Rational a) (Complex br bi) = Just $ Complex (br + a) bi
+
+builtinAdd (Imaginary a) (Imaginary b) = Just $ Imaginary (a + b)
+builtinAdd (Imaginary a) (Rational b) = Just $ Complex b a
+builtinAdd (Imaginary a) (Complex br bi) = Just $ Complex br (a + bi)
+
+builtinAdd (Complex ar ai) (Complex br bi) = Just $ Complex (ar + br) (ai + bi)
+builtinAdd (Complex ar ai) (Rational b) = Just $ Complex (ar + b) ai
+builtinAdd (Complex ar ai) (Imaginary b) = Just $ Complex ar (ai + b)
+
+builtinAdd _ _ = Nothing
+
+
+builtinSub :: Expr -> Expr -> Maybe Expr
+builtinSub a b = a `builtinAdd` ((Rational (-1)) `builtinMul` b)
+builtinSub _ _ = Nothing
+
+
+-- could be derived from addition
+builtinMul :: Expr -> Expr -> Maybe Expr
+builtinMul (Rational a) (Rational b) = Just $ Ratinal (a * b)
+builtinMul (Rational a) (Imaginary b) = Just $ Imaginary (a * b)
+builtinMul (Rational a) (Complex br bi) = Just $ Complex (a * br) (a * bi)
+
+builtinMul (Imaginary a) (Imaginary b) = Just $ Imaginary (a * b)
+builtinMul (Imaginary a) (Rational b) = Just $ Complex b a
+builtinMul (Imaginary a) (Complex br bi) = Just $ Complex (a * br) (a * bi)
+
+builtinMul _ _ = Nothing
+
+
+builtinDiv :: Expr -> Expr -> Maybe Expr
+builtinDiv _ (Rational 0) = Nothing
+builtinDiv _ (Imaginary 0) = Nothing
+builtinDiv _ (Complex 0 0) = Nothing
+builtinDiv a b = Just $ a `builtinMul` (b `builtinExp` (Rational -1))
+builtinDiv _ _ = Nothing
+
+
+builtinMod :: Expr -> Expr -> Maybe Expr
+builtinMod _ _ = Nothing
+
+
+-- could be derived from multiplication
+builtinExp :: Expr -> Expr -> Maybe Expr
+builtinExp (Rational a) (Rational b) = Just $ Rational (a ** b)
+
+builtinExp (Imaginary a) (Rational b)
+ | b < 0 = Just $ (Rational 1) `builtinDiv` ((Imaginary a) `builtinExp` (Rational b)
+ | b == 0 = Just $ Rational a
+ | b == 1 = Just $ Imaginary a
+ | b == 2 = Just $ Rational (-a)
+ | b == 3 = Just $ Imaginary (-a)
+ | otherwise = Imaginary a `builtinExp` (Rational (b - 4))
+
+builtinExp _ _ = Nothing
+
+builtinDot :: Expr -> Expr -> Maybe Expr
+_ **? _ = Nothing