final-pretty-printer-0.1.0.0: Text/PrettyPrint/Final/Rendering/PlainText.hs
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Text.PrettyPrint.Final.Rendering.PlainText
Description : Plain-text output from final pretty printers
Copyright : (c) David Darais, David Christiansen, and Weixi Ma 2016-2017
License : MIT
Maintainer : david.darais@gmail.com
Stability : experimental
Portability : Portable
This is the simplest renderer for a pretty printer: plain text, with
no formatting and fixed-width fonts.
-}
module Text.PrettyPrint.Final.Rendering.PlainText (hPutDoc, saveDoc, tempDoc) where
import Control.Monad
import Control.Applicative
import Control.Monad.Catch(MonadMask)
import Control.Monad.Reader
import Control.Monad.Writer
import Control.Monad.State
import Control.Monad.RWS
import Data.List
import Data.String (IsString(..))
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import System.IO
import System.IO.Temp
import Text.PrettyPrint.Final
hRenderChunk :: MonadIO m => Handle -> Chunk Int -> m ()
hRenderChunk h (CText t) = liftIO $ TIO.hPutStr h t
hRenderChunk h (CSpace w) = replicateM_ w (liftIO $ TIO.hPutStr h " ")
hRenderAtom :: MonadIO m => Handle -> Atom Int -> m ()
hRenderAtom h (AChunk c) = hRenderChunk h c
hRenderAtom h ANewline = liftIO $ TIO.hPutStr h "\n"
-- | Send pretty printer output to a 'Handle'
hPutDoc :: MonadIO m => Handle -> POut Int ann -> m ()
hPutDoc h out = render' out
where
render' pout = case pout of
PNull -> return ()
PAtom a -> hRenderAtom h a
PSeq o1 o2 -> render' o1 >> render' o2
PAnn a o -> render' o
-- | Save pretty printer output to a named file
saveDoc :: MonadIO m => FilePath -> IOMode -> POut Int ann -> m ()
saveDoc f mode out = liftIO $ withFile f mode (flip hPutDoc out)
-- | Save pretty printer output to temporary file. Useful for performance tests.
tempDoc :: (MonadIO m, MonadMask m) => POut Int ann -> m ()
tempDoc out = withSystemTempFile "pretty.txt" (\_ h -> hPutDoc h out)