module Language.Passage.Utils
( module Language.Passage.Utils
, module Text.PrettyPrint
) where
import Text.PrettyPrint hiding (float,double,rational)
import Data.Ratio(numerator,denominator)
import Data.Word
type NodeIdx = Int
tbd :: String -> a
tbd msg = error $ "TBD: " ++ msg
data Fixity = Prefix | Infix Posn
data Posn = ToLeft | ToRight | None
deriving Eq
class Show t => PP t where
ppPrec :: Rational -> t -> Doc
pp :: t -> Doc
pp = ppPrec 0
ppPrec _ = pp
instance PP Double where
pp = double
instance PP Int where
pp = int
instance PP Word where
pp = text . show
instance PP Integer where
pp = integer
instance PP Char where
pp = char
commaSep :: [Doc] -> Doc
commaSep = parens . hsep . punctuate comma
ppFrac :: Show a => a -> Doc
ppFrac x = case break (== '.') candidate of
(as,_:bs) | all (== '0') bs -> text as
_ -> text candidate
where candidate = show x
float :: Float -> Doc
float = ppFrac
double :: Double -> Doc
double = ppFrac
rational :: Rational -> Doc
rational r = integer (numerator r) <> text "/" <> integer (denominator r)