packages feed

ghc-bench-0.3.0: src/Imports.hs

module Imports (module Imports) where

import Prelude as Imports hiding (read, show, lines, unlines, words, unwords, error, putStrLn)

import Data.Maybe as Imports

import Data.String as Imports (IsString(..))
import Data.Functor as Imports hiding (unzip)
import Data.Bifunctor as Imports (Bifunctor(..))
import Control.Arrow as Imports ((>>>))
import Control.Monad as Imports (when, unless, (>=>))
import Data.Foldable as Imports (for_, traverse_)

import GHC.Stack as Imports (HasCallStack)
import GHC.Generics as Imports (Generic)

import Data.Text as Imports (Text, show, lines, unlines, words, unwords, pack, unpack, strip)
import Data.Text.Encoding as Imports (encodeUtf8)

import System.Exit as Imports (ExitCode(..))
import System.FilePath as Imports ((</>))

import Prelude qualified
import Text.Read (readMaybe)
import System.Exit (die)
import System.Directory (removePathForcibly)
import System.IO.Temp (createTempDirectory)
import Control.Exception (bracket)

withTempDirectory :: FilePath -> FilePath -> (FilePath -> IO a) -> IO a
withTempDirectory dir name = bracket (createTempDirectory dir name) removePathForcibly

error :: Text -> IO a
error message = die $ "\nghc-bench: " <> unpack message

read :: HasCallStack => Read a => Text -> a
read input = case readMaybe (unpack input) of
  Just a -> a
  Nothing -> Prelude.error . unpack . unwords $ ["Prelude.read: could not parse", show input]

class Bind m r where
  bind :: (a -> r) -> m a -> r

instance Monad m => Bind m (m b) where
  bind :: (a -> m b) -> m a -> m b
  bind = (=<<)

instance Bind m r => Bind m (b -> r) where
  bind :: (a -> b -> r) -> m a -> b -> r
  bind f ma b = bind (flip f b) ma

infixl 1 -<

(-<) :: Bind m r => (a -> r) -> m a -> r
(-<) = bind

pass :: Applicative m => m ()
pass = pure ()