descript-lang-0.2.0.0: src/Descript/Misc/Build/Write/Print/PrintString.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE Rank2Types #-}
module Descript.Misc.Build.Write.Print.PrintString
( pprintStr
, pprintSummary
, pprintSummaryRec
, pprintSummaryRecF
) where
import Descript.Misc.Build.Write.Print.Printable
import Descript.Misc.Build.Write.Print.APrint
import Descript.Misc.Ann
import Descript.Misc.Summary
import Data.String
import Data.List
-- | A plain printed string.
newtype PrintString
= PrintString{ runPrintString :: String }
deriving (Eq, Monoid, IsString)
instance APrint PrintString where
plex = PrintString -- Same as 'ppunc'
pimp = id
pintercal (PrintString sep)
= PrintString . intercalate sep . map runPrintString
-- | Pretty-prints the node into a string.
pprintStr :: (Printable a) => a an -> String
pprintStr = runPrintString . aprint
-- | Pretty-prints the node into a string, using the given function to
-- print children.
pprintStrRec :: (Printable a)
=> (forall b. (Printable b) => b an -> String)
-> a an
-> String
pprintStrRec sub = runPrintString . aprintRec (PrintString . sub)
-- | Pretty-prints the node into a string, using the given function to
-- print children.
pprintStrRecF :: (FwdPrintable a)
=> (forall b. (Printable b) => b an -> String)
-> a an
-> String
pprintStrRecF sub = runPrintString . afprintRec (PrintString . sub)
-- | Gets a summary of the value by printing it. Useful when
-- implementing 'Summary' on leafs ('pprintSummaryRec' for branches):
--
-- > summary = pprintSummary
pprintSummary :: (Printable a) => a an -> String
pprintSummary = pprintStr . remAnns
-- | Gets a summary of the value by printing it. Useful when
-- implementing 'Summary' (on branches or leafs):
--
-- > summaryRec = pprintSummaryRec
pprintSummaryRec :: (Printable a)
=> (forall b. (Summary b) => b -> String)
-> a an
-> String
pprintSummaryRec sub = pprintStrRec sub . remAnns
-- | Gets a summary of the value by printing it. Useful when
-- implementing 'Summary' (on branches or leafs):
--
-- > summaryRec = pprintSummaryRec
pprintSummaryRecF :: (FwdPrintable a)
=> (forall b. (Summary b) => b -> String)
-> a an
-> String
pprintSummaryRecF sub = pprintStrRecF sub . remAnns