aboutsummaryrefslogtreecommitdiff
path: root/src/Builtin.hs
blob: 8287d5a0b605d8ce8e635bb01e9a3d10a0abd7ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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