{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE Trustworthy #-} -- | Generalization of 'Prelude.putStr' and 'Prelude.putStrLn' functions. module Print ( Print (..) , print , putText , putLText ) where import Data.Function ((.)) import Monad.Trans (MonadIO, liftIO) import qualified Base import qualified Prelude (print, putStr, putStrLn) import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.Text as T import qualified Data.Text.IO as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.IO as TL -- | Polymorfic over string and lifted to 'MonadIO' printing functions. class Print a where putStr :: MonadIO m => a -> m () putStrLn :: MonadIO m => a -> m () instance Print T.Text where putStr = liftIO . T.putStr putStrLn = liftIO . T.putStrLn instance Print TL.Text where putStr = liftIO . TL.putStr putStrLn = liftIO . TL.putStrLn instance Print BS.ByteString where putStr = liftIO . BS.putStr putStrLn = liftIO . BS.putStrLn instance Print BL.ByteString where putStr = liftIO . BL.putStr putStrLn = liftIO . BL.putStrLn instance Print [Base.Char] where putStr = liftIO . Prelude.putStr putStrLn = liftIO . Prelude.putStrLn -- | Lifted version of 'Prelude.print'. print :: forall a m . (MonadIO m, Base.Show a) => a -> m () print = liftIO . Prelude.print -- | Specialized to 'T.Text' version of 'putStrLn' or forcing type inference. putText :: MonadIO m => T.Text -> m () putText = putStrLn {-# SPECIALIZE putText :: T.Text -> Base.IO () #-} -- | Specialized to 'TL.Text' version of 'putStrLn' or forcing type inference. putLText :: MonadIO m => TL.Text -> m () putLText = putStrLn {-# SPECIALIZE putLText :: TL.Text -> Base.IO () #-}