------------------------------------------------------------------------------
-- |
-- Module      : PhatSort.Monad.Stdio
-- Description : standard I/O
-- Copyright   : Copyright (c) 2019-2023 Travis Cardwell
-- License     : MIT
------------------------------------------------------------------------------

module PhatSort.Monad.Stdio
  ( -- * MonadStdio
    MonadStdio(..)
  ) where

-- https://hackage.haskell.org/package/base
import qualified Prelude
import Prelude hiding (putStrLn)

-- https://hackage.haskell.org/package/transformers
import Control.Monad.Trans.Class (MonadTrans(lift))
import Control.Monad.Trans.Except (ExceptT)

------------------------------------------------------------------------------
-- $MonadStdio

-- | Standard I/O
--
-- @since 0.5.0.0
class Monad m => MonadStdio m where
  -- | Write a 'String' to @STDOUT@, appending a newline
  putStrLn :: String -> m ()

instance MonadStdio IO where
  putStrLn :: String -> IO ()
putStrLn = String -> IO ()
Prelude.putStrLn
  {-# INLINE putStrLn #-}

instance MonadStdio m => MonadStdio (ExceptT e m) where
  putStrLn :: String -> ExceptT e m ()
putStrLn = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *). MonadStdio m => String -> m ()
putStrLn
  {-# INLINE putStrLn #-}