packages feed

egison-5.1.0: hs-src/Language/Egison/PrettyMath/Mathematica.hs

{- |
Module      : Language.Egison.PrettyMath.Mathematica
Licence     : MIT
-}

module Language.Egison.PrettyMath.Mathematica
  ( showMathValue
  ) where

import           Data.List                      (intercalate)

import           Language.Egison.PrettyMath.AST

showMathValue :: MathValue -> String
showMathValue (Atom a []) = a
showMathValue (Atom a xs) = a ++ showMathValueIndices xs
showMathValue (Partial f xs) = showMathValue f ++ "_" ++ showMathValues "_" xs
showMathValue (NegativeAtom a) = "-" ++ a
showMathValue (Plus []) = ""
showMathValue (Plus (x:xs)) = showMathValue x ++ showMathValueForPlus xs
 where
  showMathValueForPlus :: [MathValue] -> String
  showMathValueForPlus []                                  = ""
  showMathValueForPlus (NegativeAtom a:xs)                 = " - " ++ a ++ showMathValueForPlus xs
  showMathValueForPlus (Multiply (NegativeAtom "1":ys):xs) = " - " ++ showMathValue (Multiply ys) ++ showMathValueForPlus xs
  showMathValueForPlus (Multiply (NegativeAtom a:ys):xs)   = " - " ++ showMathValue (Multiply (Atom a []:ys)) ++ showMathValueForPlus xs
  showMathValueForPlus (x:xs)                              = " + " ++  showMathValue x ++ showMathValueForPlus xs
showMathValue (Multiply []) = ""
showMathValue (Multiply [x]) = showMathValue x
showMathValue (Multiply (Atom "1" []:xs)) = showMathValue (Multiply xs)
showMathValue (Multiply (NegativeAtom "1":xs)) = "-" ++ showMathValue (Multiply xs)
showMathValue (Multiply (x:xs)) = showMathValue' x ++ " " ++ showMathValue (Multiply xs)
showMathValue (Div x y) = addBracket x ++ "/" ++ addBracket y
 where
   addBracket x@(Atom _ []) = showMathValue x
   addBracket x             = "(" ++ showMathValue x ++ ")"
showMathValue (Power lv1 lv2) = showMathValue lv1 ++ "^" ++ showMathValue lv2
showMathValue (Func (Atom "sqrt" []) [x]) = "Sqrt[" ++ showMathValue x ++ "]"
showMathValue (Func (Atom "rt" []) [x, y]) = "Surd[" ++ showMathValue x ++ "," ++ showMathValue y ++ "]"
showMathValue (Func (Atom "exp" []) [x])= "e^(" ++ showMathValue x ++ ")"
showMathValue (Func f xs) = showMathValue f ++ "(" ++ showMathValueArg xs ++ ")"
showMathValue (Tensor lvs mis)
  | null mis = "{" ++ showMathValueArg lvs ++ "}"
  | not (any isSub mis) = "{" ++ showMathValueArg lvs ++ "}^(" ++ showMathValueIndices mis ++ ")"
  | all isSub mis = "{" ++ showMathValueArg lvs ++ "}_(" ++ showMathValueIndices mis ++ ")"
  | otherwise = "{" ++ showMathValueArg lvs ++ "}_(" ++ showMathValueIndices (filter isSub mis) ++ ")^(" ++ showMathValueIndices (filter (not . isSub) mis) ++ ")"
showMathValue (Tuple xs) = "(" ++ showMathValueArg xs ++ ")"
showMathValue (Collection xs) = "{" ++ showMathValueArg xs ++ "}"
showMathValue (Quote x) = "(" ++ showMathValue x ++ ")"

showMathValue' :: MathValue -> String
showMathValue' (Plus xs) = "(" ++ showMathValue (Plus xs) ++ ")"
showMathValue' x         = showMathValue x

showMathValues :: String -> [MathValue] -> String
showMathValues sep exprs = intercalate sep $ map showMathValue exprs

showMathValueArg :: [MathValue] -> String
showMathValueArg = showMathValues ", "

showMathValueIndices :: [MathIndex] -> String
showMathValueIndices []  = error "unreachable"
showMathValueIndices lvs = concatMap showMathIndex lvs

showMathIndex :: MathIndex -> String
showMathIndex (Super a) = showMathValue a
showMathIndex (Sub a)   = showMathValue a