content: {-# LANGUAGE ScopedTypeVariables, BangPatterns #-}
  
  module SpecHelper where
  
  import           Control.Exception   (bracket_, bracket)
  import           Data.List           (intercalate)
  import           System.Directory    (createDirectoryIfMissing,
                                        getCurrentDirectory,
                                        removeDirectoryRecursive,
                                        setCurrentDirectory)
  import           System.Environment  (setEnv, lookupEnv, unsetEnv)
  
  concatLines :: [String] -> String
  concatLines = intercalate "\n"
  
  withEnv :: String -> String -> IO a -> IO a
  withEnv k v action = do
      bracket setup teardown (const action)
    where
      setup :: IO (Maybe String)
      setup = do
        mv <- lookupEnv k
        setEnv k v
        return mv
      teardown :: Maybe String -> IO ()
      teardown (Just _v) = setEnv k _v >> return ()
      teardown Nothing   = unsetEnv k >> return ()
  
  inTestDirectory :: IO () -> IO ()
  inTestDirectory action = do
      pwd <- getCurrentDirectory
      let go    = createDirectoryIfMissing True testDirectory >> setCurrentDirectory testDirectory
          flush = removeDirectoryRecursive testDirectory
          back  = setCurrentDirectory pwd
      bracket_ go (back >> flush) action
  
  testDirectory :: String
  testDirectory = "test_project"
  
  quote :: String -> String
  quote s = "\"" ++ s ++ "\""
  
  {-# ANN module "HLint: Redundant do" #-}
  