{-# LANGUAGE PartialTypeSignatures #-}
module OurPrelude
( (>>>),
(<|>),
(<>),
(<&>),
(&),
module Control.Error,
module Control.Monad.Except,
module Control.Monad.Trans.Class,
module Control.Monad.IO.Class,
module Data.Bifunctor,
module System.Process.Typed,
module Polysemy,
module Polysemy.Error,
Set,
Text,
Vector,
interpolate,
tshow,
tryIOTextET,
whenM,
ourReadProcess_,
ourReadProcess_Sem,
ourReadProcessInterleaved_,
ourReadProcessInterleavedBS_,
ourReadProcessInterleaved,
ourReadProcessInterleaved_Sem,
ourReadProcessInterleavedSem,
silently,
bytestringToText,
)
where
import Control.Applicative ((<|>))
import Control.Category ((>>>))
import Control.Error
import Control.Monad.Except
import Control.Monad.IO.Class
import Control.Monad.Trans.Class
import Data.Bifunctor
import qualified Data.ByteString.Lazy as BSL
import Data.Function ((&))
import Data.Functor ((<&>))
import Data.Set (Set)
import Data.Text (Text, pack)
import qualified Data.Text.Encoding as T
import qualified Data.Text.Encoding.Error as T
import Data.Vector (Vector)
import Language.Haskell.TH.Quote
import qualified NeatInterpolation
import Polysemy
import Polysemy.Error hiding (note, try, tryJust)
import qualified Process as P
import System.Exit
import System.Process.Typed
interpolate :: QuasiQuoter
interpolate = NeatInterpolation.text
tshow :: Show a => a -> Text
tshow = show >>> pack
tryIOTextET :: MonadIO m => IO a -> ExceptT Text m a
tryIOTextET = syncIO >>> fmapLT tshow
whenM :: Monad m => m Bool -> m () -> m ()
whenM c a = c >>= \res -> when res a
bytestringToText :: BSL.ByteString -> Text
bytestringToText = BSL.toStrict >>> (T.decodeUtf8With T.lenientDecode)
ourReadProcessInterleavedBS_ ::
MonadIO m =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
ExceptT Text m BSL.ByteString
ourReadProcessInterleavedBS_ = readProcessInterleaved_ >>> tryIOTextET
ourReadProcess_ ::
MonadIO m =>
ProcessConfig stdin stdout stderr ->
ExceptT Text m (Text, Text)
ourReadProcess_ = readProcess_ >>> tryIOTextET >>> fmapRT (\(stdout,stderr) -> (bytestringToText stdout, bytestringToText stderr))
ourReadProcess_Sem ::
Members '[P.Process] r =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
Sem r (Text, Text)
ourReadProcess_Sem =
P.read_ >>> fmap (\(stdout,stderr) -> (bytestringToText stdout, bytestringToText stderr))
ourReadProcessInterleaved_ ::
MonadIO m =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
ExceptT Text m Text
ourReadProcessInterleaved_ =
readProcessInterleaved_ >>> tryIOTextET >>> fmapRT bytestringToText
ourReadProcessInterleaved_Sem ::
Members '[P.Process] r =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
Sem r Text
ourReadProcessInterleaved_Sem =
P.readInterleaved_ >>> fmap bytestringToText
ourReadProcessInterleaved ::
MonadIO m =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
ExceptT Text m (ExitCode, Text)
ourReadProcessInterleaved =
readProcessInterleaved
>>> tryIOTextET
>>> fmapRT (\(a, b) -> (a, bytestringToText b))
ourReadProcessInterleavedSem ::
Members '[P.Process] r =>
ProcessConfig stdin stdoutIgnored stderrIgnored ->
Sem r (ExitCode, Text)
ourReadProcessInterleavedSem =
P.readInterleaved
>>> fmap (\(a, b) -> (a, bytestringToText b))
silently :: ProcessConfig stdin stdout stderr -> ProcessConfig () () ()
silently = setStderr closed >>> setStdin closed >>> setStdout closed