polynomial-algebra-0.1: src/Math/Algebra/Polynomial/Pretty.hs
{-# LANGUAGE FlexibleInstances #-}
-- | Pretty-printing.
--
-- Tip: you can try putting something like this into your @.ghci@ file to
-- make life more convenient:
--
-- > :m +Math.Algebra.Polynomial.Pretty
-- > :seti -interactive-print=prettyPrint
--
module Math.Algebra.Polynomial.Pretty where
--------------------------------------------------------------------------------
import Data.List
import Data.Ratio
import Math.Algebra.Polynomial.FreeModule ( FreeMod, ZMod, QMod )
import qualified Math.Algebra.Polynomial.FreeModule as ZMod
import Math.Algebra.Polynomial.Misc
--------------------------------------------------------------------------------
class Pretty a where
pretty :: a -> String
prettyInParens :: a -> String
prettyInParens = pretty
prettyPrint :: Pretty a => a -> IO ()
prettyPrint = putStrLn . pretty
--------------------------------------------------------------------------------
-- instance Pretty a => Pretty (ZMod a) where
-- pretty = prettyZMod pretty
instance (Num c, Eq c, Pretty c, IsSigned c, Pretty b) => Pretty (FreeMod c b) where
pretty = prettyFreeMod' True pretty
prettyInParens x = "(" ++ pretty x ++ ")"
--------------------------------------------------------------------------------
instance Pretty Int where
pretty = show
instance Pretty Integer where
pretty = show
instance (Eq a, Num a, Pretty a) => Pretty (Ratio a) where
pretty q = case denominator q of
1 -> prettyInParens (numerator q)
_ -> prettyInParens (numerator q) ++ "/" ++ prettyInParens (denominator q)
--------------------------------------------------------------------------------
-- * Pretty printing elements of free modules
-- | Example: @showVarPower "x" 5 == "x^5"@
showVarPower :: String -> Int -> String
showVarPower name expo = case expo of
0 -> "1"
1 -> name
_ -> name ++ "^" ++ show expo
--------------------------------------------------------------------------------
-- | no multiplication sign (ok for mathematica and humans)
prettyZMod_ :: (b -> String) -> ZMod b -> String
prettyZMod_ = prettyFreeMod' False
-- | multiplication sign (ok for maple etc)
prettyZMod :: (b -> String) -> ZMod b -> String
prettyZMod = prettyFreeMod' True
--------------------------------------------------------------------------------
prettyFreeMod'
:: (Num c, Eq c, IsSigned c, Pretty c)
=> Bool -- ^ use star for multiplication (@False@ means just concatenation)
-> (b -> String) -- ^ show base
-> FreeMod c b
-> String
prettyFreeMod' star showBase what = final where
final = if take 3 stuff == " + " then drop 3 stuff else drop 1 stuff
stuff = concatMap f (ZMod.toList what)
f (g, 1) = plus ++ showBase' g
f (g, -1) = minus ++ showBase' g
f (g, c) = case showBase' g of
"1" -> sgn c ++ (prettyInParens $ abs c)
b -> sgn c ++ (prettyInParens $ abs c) ++ starStr ++ b
-- cond (_,c) = (c/=0)
starStr = if star then "*" else " "
showBase' g = case showBase g of
"" -> "1" -- "(1)"
s -> s
sgn c = case signOf c of
Just Minus -> minus
_ -> plus
plus = " + "
minus = " - "
prettyFreeMod''
:: (c -> String) -- ^ show coefficient
-> (b -> String) -- ^ show base
-> FreeMod c b
-> String
prettyFreeMod'' showCoeff showBase what = result where
result = intercalate " + " (map f $ ZMod.toList what)
f (g, c) = case showBase g of
"" -> showCoeff c
"1" -> showCoeff c
b -> showCoeff c ++ starStr ++ b
starStr = "*"
--------------------------------------------------------------------------------
{-
-- * Utility
-- | Put into parentheses
paren :: String -> String
paren s = '(' : s ++ ")"
--------------------------------------------------------------------------------
{-
-- | Exponential form of a partition
expFormString :: Partition -> String
expFormString p = "(" ++ intercalate "," (map f ies) ++ ")" where
ies = toExponentialForm p
f (i,e) = show i ++ "^" ++ show e
-}
extendStringL :: Int -> String -> String
extendStringL k s = s ++ replicate (k - length s) ' '
extendStringR :: Int -> String -> String
extendStringR k s = replicate (k - length s) ' ' ++ s
--------------------------------------------------------------------------------
-- * Mathematica-formatted output
class Mathematica a where
mathematica :: a -> String
instance Mathematica Int where
mathematica = show
instance Mathematica Integer where
mathematica = show
instance Mathematica String where
mathematica = show
{-
instance Mathematica Partition where
mathematica (Partition ps) = "{" ++ intercalate "," (map show ps) ++ "}"
-}
data Indexed a = Indexed String a
instance Mathematica a => Mathematica (Indexed a) where
mathematica (Indexed x sub) = "Subscript[" ++ x ++ "," ++ mathematica sub ++ "]"
--------------------------------------------------------------------------------
-}