{-# LANGUAGE FlexibleInstances, Safe #-}-- | Monadic front-end to Text.PrettyPrintmoduleLanguage.Haskell.TH.PprLib(-- * The document typeDoc ,-- Abstract, instance of ShowPprM ,-- * Primitive Documentsempty ,semi ,comma ,colon ,dcolon ,space ,equals ,arrow ,lparen ,rparen ,lbrack ,rbrack ,lbrace ,rbrace ,-- * Converting values into documentstext ,char ,ptext ,int ,integer ,float ,double ,rational ,-- * Wrapping documents in delimitersparens ,brackets ,braces ,quotes ,doubleQuotes ,-- * Combining documents(<>) ,(<+>) ,hcat ,hsep ,($$) ,($+$) ,vcat ,sep ,cat ,fsep ,fcat ,nest ,hang ,punctuate ,-- * Predicates on documentsisEmpty ,to_HPJ_Doc ,pprName ,pprName' )whereimportLanguage.Haskell.TH.Syntax (Uniq ,Name (..),showName' ,NameFlavour (..),NameIs (..))importqualifiedText.PrettyPrint asHPJimportControl.Monad (liftM ,liftM2 ,ap )importLanguage.Haskell.TH.Lib.Map (Map )importqualifiedLanguage.Haskell.TH.Lib.Map asMap(lookup ,insert ,empty )importPrelude hiding((<>) )infixl6<> infixl6<+> infixl5$$ ,$+$ -- ----------------------------------------------------------------------------- The interface-- The primitive Doc valuesinstanceShow Doc whereshow :: Doc -> String show Doc d =Doc -> String HPJ.render (Doc -> Doc to_HPJ_Doc Doc d )isEmpty ::Doc ->PprM Bool ;-- ^ Returns 'True' if the document is emptyempty ::Doc ;-- ^ An empty documentsemi ::Doc ;-- ^ A ';' charactercomma ::Doc ;-- ^ A ',' charactercolon ::Doc ;-- ^ A ':' characterdcolon ::Doc ;-- ^ A "::" stringspace ::Doc ;-- ^ A space characterequals ::Doc ;-- ^ A '=' characterarrow ::Doc ;-- ^ A "->" stringlparen ::Doc ;-- ^ A '(' characterrparen ::Doc ;-- ^ A ')' characterlbrack ::Doc ;-- ^ A '[' characterrbrack ::Doc ;-- ^ A ']' characterlbrace ::Doc ;-- ^ A '{' characterrbrace ::Doc ;-- ^ A '}' charactertext ::String ->Doc ptext ::String ->Doc char ::Char ->Doc int ::Int ->Doc integer ::Integer->Doc float ::Float ->Doc double ::Double ->Doc rational ::Rational ->Doc parens ::Doc ->Doc ;-- ^ Wrap document in @(...)@brackets ::Doc ->Doc ;-- ^ Wrap document in @[...]@braces ::Doc ->Doc ;-- ^ Wrap document in @{...}@quotes ::Doc ->Doc ;-- ^ Wrap document in @\'...\'@doubleQuotes ::Doc ->Doc ;-- ^ Wrap document in @\"...\"@-- Combining @Doc@ values(<>) ::Doc ->Doc ->Doc ;-- ^Besidehcat ::[Doc ]->Doc ;-- ^List version of '<>'(<+>) ::Doc ->Doc ->Doc ;-- ^Beside, separated by spacehsep ::[Doc ]->Doc ;-- ^List version of '<+>'($$) ::Doc ->Doc ->Doc ;-- ^Above; if there is no-- overlap it \"dovetails\" the two($+$) ::Doc ->Doc ->Doc ;-- ^Above, without dovetailing.vcat ::[Doc ]->Doc ;-- ^List version of '$$'cat ::[Doc ]->Doc ;-- ^ Either hcat or vcatsep ::[Doc ]->Doc ;-- ^ Either hsep or vcatfcat ::[Doc ]->Doc ;-- ^ \"Paragraph fill\" version of catfsep ::[Doc ]->Doc ;-- ^ \"Paragraph fill\" version of sepnest ::Int ->Doc ->Doc ;-- ^ Nested-- GHC-specific ones.hang ::Doc ->Int ->Doc ->Doc ;-- ^ @hang d1 n d2 = sep [d1, nest n d2]@punctuate ::Doc ->[Doc ]->[Doc ]-- ^ @punctuate p [d1, ... dn] = [d1 \<> p, d2 \<> p, ... dn-1 \<> p, dn]@-- ----------------------------------------------------------------------------- The "implementation"typeState =(Map Name Name ,Uniq )dataPprM a =PprM {forall a. PprM a -> State -> (a, State) runPprM ::State ->(a ,State )}pprName ::Name ->Doc pprName :: Name -> Doc pprName =NameIs -> Name -> Doc pprName' NameIs Alone pprName' ::NameIs ->Name ->Doc pprName' :: NameIs -> Name -> Doc pprName' NameIs ni n :: Name n @(Name OccName o (NameU Uniq _))=(State -> (Doc, State)) -> Doc forall a. (State -> (a, State)) -> PprM a PprM ((State -> (Doc, State)) -> Doc) -> (State -> (Doc, State)) -> Doc forall a b. (a -> b) -> a -> b $ \s :: State s @(Map Name Name fm ,Uniq i )->let(Name n' ,State s' )=caseName -> Map Name Name -> Maybe Name forall k a. Ord k => k -> Map k a -> Maybe a Map.lookup Name n Map Name Name fm ofJust Name d ->(Name d ,State s )Maybe Name Nothing ->letn'' :: Name n'' =OccName -> NameFlavour -> Name Name OccName o (Uniq -> NameFlavour NameU Uniq i )in(Name n'' ,(Name -> Name -> Map Name Name -> Map Name Name forall k a. Ord k => k -> a -> Map k a -> Map k a Map.insert Name n Name n'' Map Name Name fm ,Uniq i Uniq -> Uniq -> Uniq forall a. Num a => a -> a -> a + Uniq 1))in(String -> Doc HPJ.text (String -> Doc) -> String -> Doc forall a b. (a -> b) -> a -> b $ NameIs -> Name -> String showName' NameIs ni Name n' ,State s' )pprName' NameIs ni Name n =String -> Doc text (String -> Doc) -> String -> Doc forall a b. (a -> b) -> a -> b $ NameIs -> Name -> String showName' NameIs ni Name n {- instance Show Name where show (Name occ (NameU u)) = occString occ ++ "_" ++ show (I# u) show (Name occ NameS) = occString occ show (Name occ (NameG ns m)) = modString m ++ "." ++ occString occ data Name = Name OccName NameFlavour data NameFlavour | NameU Int# -- A unique local name -}to_HPJ_Doc ::Doc ->HPJ.Doc to_HPJ_Doc :: Doc -> Doc to_HPJ_Doc Doc d =(Doc, State) -> Doc forall a b. (a, b) -> a fst ((Doc, State) -> Doc) -> (Doc, State) -> Doc forall a b. (a -> b) -> a -> b $ Doc -> State -> (Doc, State) forall a. PprM a -> State -> (a, State) runPprM Doc d (Map Name Name forall k a. Map k a Map.empty ,Uniq 0)instanceFunctor PprM wherefmap :: forall a b. (a -> b) -> PprM a -> PprM b fmap =(a -> b) -> PprM a -> PprM b forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM instanceApplicative PprM wherepure :: forall a. a -> PprM a pure a x =(State -> (a, State)) -> PprM a forall a. (State -> (a, State)) -> PprM a PprM ((State -> (a, State)) -> PprM a) -> (State -> (a, State)) -> PprM a forall a b. (a -> b) -> a -> b $ \State s ->(a x ,State s )<*> :: forall a b. PprM (a -> b) -> PprM a -> PprM b (<*>) =PprM (a -> b) -> PprM a -> PprM b forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b ap instanceMonad PprM wherePprM a m >>= :: forall a b. PprM a -> (a -> PprM b) -> PprM b >>= a -> PprM b k =(State -> (b, State)) -> PprM b forall a. (State -> (a, State)) -> PprM a PprM ((State -> (b, State)) -> PprM b) -> (State -> (b, State)) -> PprM b forall a b. (a -> b) -> a -> b $ \State s ->let(a x ,State s' )=PprM a -> State -> (a, State) forall a. PprM a -> State -> (a, State) runPprM PprM a m State s inPprM b -> State -> (b, State) forall a. PprM a -> State -> (a, State) runPprM (a -> PprM b k a x )State s' typeDoc =PprM HPJ.Doc -- The primitive Doc valuesisEmpty :: Doc -> PprM Bool isEmpty =(Doc -> Bool) -> Doc -> PprM Bool forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Bool HPJ.isEmpty empty :: Doc empty =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.empty semi :: Doc semi =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.semi comma :: Doc comma =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.comma colon :: Doc colon =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.colon dcolon :: Doc dcolon =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> Doc -> Doc forall a b. (a -> b) -> a -> b $ String -> Doc HPJ.text String "::"space :: Doc space =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.space equals :: Doc equals =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.equals arrow :: Doc arrow =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> Doc -> Doc forall a b. (a -> b) -> a -> b $ String -> Doc HPJ.text String "->"lparen :: Doc lparen =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.lparen rparen :: Doc rparen =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.rparen lbrack :: Doc lbrack =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.lbrack rbrack :: Doc rbrack =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.rbrack lbrace :: Doc lbrace =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.lbrace rbrace :: Doc rbrace =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return Doc HPJ.rbrace text :: String -> Doc text =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (String -> Doc) -> String -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> Doc HPJ.text ptext :: String -> Doc ptext =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (String -> Doc) -> String -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> Doc HPJ.ptext char :: Char -> Doc char =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Char -> Doc) -> Char -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Char -> Doc HPJ.char int :: Int -> Doc int =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Int -> Doc) -> Int -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> Doc HPJ.int integer :: Uniq -> Doc integer =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Uniq -> Doc) -> Uniq -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Uniq -> Doc HPJ.integer float :: Float -> Doc float =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Float -> Doc) -> Float -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Float -> Doc HPJ.float double :: Double -> Doc double =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Double -> Doc) -> Double -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Double -> Doc HPJ.double rational :: Rational -> Doc rational =Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Doc) -> (Rational -> Doc) -> Rational -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . Rational -> Doc HPJ.rational parens :: Doc -> Doc parens =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Doc HPJ.parens brackets :: Doc -> Doc brackets =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Doc HPJ.brackets braces :: Doc -> Doc braces =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Doc HPJ.braces quotes :: Doc -> Doc quotes =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Doc HPJ.quotes doubleQuotes :: Doc -> Doc doubleQuotes =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM Doc -> Doc HPJ.doubleQuotes -- Combining @Doc@ values<> :: Doc -> Doc -> Doc (<>) =(Doc -> Doc -> Doc) -> Doc -> Doc -> Doc forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 Doc -> Doc -> Doc (HPJ.<>) hcat :: [Doc] -> Doc hcat =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.hcat (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence <+> :: Doc -> Doc -> Doc (<+>) =(Doc -> Doc -> Doc) -> Doc -> Doc -> Doc forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 Doc -> Doc -> Doc (HPJ.<+>) hsep :: [Doc] -> Doc hsep =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.hsep (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence $$ :: Doc -> Doc -> Doc ($$) =(Doc -> Doc -> Doc) -> Doc -> Doc -> Doc forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 Doc -> Doc -> Doc (HPJ.$$) $+$ :: Doc -> Doc -> Doc ($+$) =(Doc -> Doc -> Doc) -> Doc -> Doc -> Doc forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 Doc -> Doc -> Doc (HPJ.$+$) vcat :: [Doc] -> Doc vcat =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.vcat (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence cat :: [Doc] -> Doc cat =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.cat (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence sep :: [Doc] -> Doc sep =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.sep (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence fcat :: [Doc] -> Doc fcat =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.fcat (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence fsep :: [Doc] -> Doc fsep =([Doc] -> Doc) -> PprM [Doc] -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [Doc] -> Doc HPJ.fsep (PprM [Doc] -> Doc) -> ([Doc] -> PprM [Doc]) -> [Doc] -> Doc forall b c a. (b -> c) -> (a -> b) -> a -> c . [Doc] -> PprM [Doc] forall (t :: * -> *) (m :: * -> *) a. (Traversable t, Monad m) => t (m a) -> m (t a) forall (m :: * -> *) a. Monad m => [m a] -> m [a] sequence nest :: Int -> Doc -> Doc nest Int n =(Doc -> Doc) -> Doc -> Doc forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM (Int -> Doc -> Doc HPJ.nest Int n )hang :: Doc -> Int -> Doc -> Doc hang Doc d1 Int n Doc d2 =doDoc d1' <-Doc d1 Doc d2' <-Doc d2 Doc -> Doc forall a. a -> PprM a forall (m :: * -> *) a. Monad m => a -> m a return (Doc -> Int -> Doc -> Doc HPJ.hang Doc d1' Int n Doc d2' )-- punctuate uses the same definition as Text.PrettyPrintpunctuate :: Doc -> [Doc] -> [Doc] punctuate Doc _[]=[]punctuate Doc p (Doc d : [Doc] ds )=Doc -> [Doc] -> [Doc] go Doc d [Doc] ds wherego :: Doc -> [Doc] -> [Doc] go Doc d' []=[Doc d' ]go Doc d' (Doc e : [Doc] es )=(Doc d' Doc -> Doc -> Doc <> Doc p )Doc -> [Doc] -> [Doc] forall a. a -> [a] -> [a] : Doc -> [Doc] -> [Doc] go Doc e [Doc] es