packages feed

lazy-scope-0.0.1: src/Lazy/Scope/Io.hs

module Lazy.Scope.Io where

import Control.DeepSeq (NFData)
import Control.Monad.Trans.Class (MonadTrans(lift))
import Data.ByteString qualified as S
import Data.ByteString.Lazy qualified as L
import Foreign.Ptr (Ptr)
import Lazy.Scope.Type (LazyT(..), HandlePosn(..), Handle(..), Bs, Scoped(Scoped))
import Relude
    ( ($), ($!), (<$>),
      Bool(..),
      ByteString,
      Char,
      Show,
      String,
      Maybe (..),
      Integer,
      Int,
      MonadIO(..),
      FilePath,
      IOMode )
import System.IO qualified as IO
import System.IO (SeekMode (..), BufferMode, TextEncoding, NewlineMode)
import UnliftIO (MonadUnliftIO (..))
import UnliftIO.IO qualified as U

class WithFile a where
  withFile       :: (NFData r, MonadUnliftIO m) =>
    a -> IOMode -> (forall s. Handle s -> LazyT s m r) -> m r
  withBinaryFile :: (NFData r, MonadUnliftIO m) =>
    a -> IOMode -> (forall s. Handle s -> LazyT s m r) -> m r

instance WithFile FilePath where
  {-# INLINE withFile #-}
  withFile fp mode cb =
    U.withFile fp mode (\h -> unLazy (cb (Handle h)))
  {-# INLINE withBinaryFile #-}
  withBinaryFile fp mode cb =
    U.withBinaryFile fp mode (\h -> unLazy (cb (Handle h)))

hSeek :: MonadIO m => Handle s -> SeekMode -> Integer -> LazyT s m ()
hSeek (Handle h) sm n = LazyT $! U.hSeek h sm n
{-# INLINE hSeek #-}

hTell :: MonadIO m => Handle s -> LazyT s m Integer
hTell (Handle h) = lift $! U.hTell h
{-# INLINE hTell #-}

hSetPosn :: MonadIO m => HandlePosn s -> LazyT s m ()
hSetPosn (HandlePosn hpn) = lift (liftIO $! IO.hSetPosn hpn)

hGetPosn :: MonadIO m => Handle s -> LazyT s m (HandlePosn s)
hGetPosn (Handle h) = lift (liftIO $! HandlePosn <$> IO.hGetPosn h)

hFlush :: MonadIO m => Handle s -> LazyT s m ()
hFlush (Handle h) = lift (U.hFlush h)

hGetBuffering :: MonadIO m => Handle s -> LazyT s m BufferMode
hGetBuffering (Handle h) = lift (U.hGetBuffering h)

hSetBuffering :: MonadIO m => Handle s -> BufferMode -> LazyT s m ()
hSetBuffering (Handle h) bm = lift (U.hSetBuffering h bm)

hIsEOF :: MonadIO m => Handle s -> LazyT s m Bool
hIsEOF (Handle h) = lift (U.hIsEOF h)

hSetFileSize :: MonadIO m => Handle s -> Integer -> LazyT s m ()
hSetFileSize (Handle h) n = lift (U.hSetFileSize h n)

hFileSize :: MonadIO m => Handle s -> LazyT s m Integer
hFileSize (Handle h) = lift (U.hFileSize h)

hSetEncoding :: MonadIO m => Handle s -> TextEncoding -> LazyT s m ()
hSetEncoding (Handle h) te = lift (liftIO $ IO.hSetEncoding h te)

hGetEncoding :: MonadIO m => Handle s -> LazyT s m (Maybe TextEncoding)
hGetEncoding (Handle h) = lift (liftIO $ IO.hGetEncoding h)

hSetBinaryMode :: MonadIO m => Handle s -> Bool -> LazyT s m ()
hSetBinaryMode (Handle h) b = lift (liftIO $ IO.hSetBinaryMode h b)

hPutBuf :: MonadIO m => Handle s -> Ptr a -> Int -> LazyT s m ()
hPutBuf (Handle h) p n = lift (liftIO $ IO.hPutBuf h p n)

hGetBuf :: MonadIO m => Handle s -> Ptr a -> Int -> LazyT s m Int
hGetBuf (Handle h) p n = lift (liftIO $ IO.hGetBuf h p n)

hGetBufSome :: MonadIO m => Handle s -> Ptr a -> Int -> LazyT s m Int
hGetBufSome (Handle h) p n = lift (liftIO $ IO.hGetBufSome h p n)

hPutBufNonBlocking :: MonadIO m => Handle s -> Ptr a -> Int -> LazyT s m Int
hPutBufNonBlocking (Handle h) p n = lift (liftIO $ IO.hPutBufNonBlocking h p n)

hGetBufNonBlocking :: MonadIO m => Handle s -> Ptr a -> Int -> LazyT s m Int
hGetBufNonBlocking (Handle h) p n = lift (liftIO $ IO.hGetBufNonBlocking h p n)

hSetNewlineMode :: MonadIO m => Handle s -> NewlineMode -> LazyT s m ()
hSetNewlineMode (Handle h) nlm = lift (liftIO $ IO.hSetNewlineMode h nlm)

hPrint :: (MonadIO m, Show a) => Handle s -> a -> LazyT s m ()
hPrint (Handle h) a = lift (liftIO $ IO.hPrint h a)

hGetChar :: MonadIO m => Handle s -> LazyT s m Char
hGetChar (Handle h) = lift (liftIO $ IO.hGetChar h)

hReady :: MonadIO m => Handle s -> LazyT s m Bool
hReady (Handle h) = lift (U.hReady h)

hWaitForInput :: MonadIO m => Handle s -> Int -> LazyT s m Bool
hWaitForInput (Handle h) n = lift (U.hWaitForInput h n)

hShow :: MonadIO m => Handle s -> LazyT s m String
hShow (Handle h) = lift $ (liftIO $ IO.hShow h)

hGetEcho :: MonadIO m => Handle s -> LazyT s m Bool
hGetEcho (Handle h) = lift (U.hGetEcho h)

hSetEcho :: MonadIO m => Handle s -> Bool -> LazyT s m ()
hSetEcho (Handle h) eb = lift (U.hSetEcho h eb)

hIsTerminalDevice :: MonadIO m => Handle s -> LazyT s m Bool
hIsTerminalDevice (Handle h) = lift (U.hIsTerminalDevice h)

hIsSeekable :: MonadIO m => (Handle s) -> LazyT s m Bool
hIsSeekable (Handle h) = lift (U.hIsSeekable h)

hIsWritable :: MonadIO m => Handle s -> LazyT s m Bool
hIsWritable (Handle h) = lift (U.hIsWritable h)

hIsReadable :: MonadIO m => Handle s -> LazyT s m Bool
hIsReadable (Handle h) = lift (U.hIsReadable h)

hPutStrLn :: MonadIO m => Handle s -> String -> LazyT s m ()
hPutStrLn (Handle h) s = lift (liftIO $ IO.hPutStrLn h s)

hPutStr :: MonadIO m => Handle s -> String -> LazyT s m ()
hPutStr (Handle h) s = lift (liftIO $ IO.hPutStr h s)

hPutBs :: MonadIO m => Handle s -> Bs s -> LazyT s m ()
hPutBs (Handle h) (Scoped lbs) = LazyT (liftIO $ L.hPut h lbs)

hPut :: MonadIO m => Handle s -> L.ByteString -> LazyT s m ()
hPut (Handle h) lbs = LazyT (liftIO $ L.hPut h lbs)

hPutChar :: MonadIO m => Handle s -> Char -> LazyT s m ()
hPutChar (Handle h) c = lift (liftIO $ IO.hPutChar h c)

hLookAhead :: MonadIO m => Handle s -> LazyT s m Char
hLookAhead (Handle h) = lift (liftIO $ IO.hLookAhead h)

hGetLine :: MonadIO m => Handle s -> LazyT s m String
hGetLine (Handle h) = lift (liftIO $ IO.hGetLine h)

hGet :: MonadIO m => Handle s -> Int -> LazyT s m ByteString
hGet (Handle h) n = lift (liftIO $ S.hGet h n)