module Development.Shake.ATS.Environment ( fixDir
                                         , pkgHome
                                         , ccToDir
                                         ) where

import           Control.Monad.IO.Class
import qualified Data.Text.Lazy             as TL
import           Development.Shake.C
import           Development.Shake.FilePath
import           System.Environment         (getEnv)

-- | Given a C compiler, return the appropriate directory for its globally
-- installed artifacts. This is used to keep libraries built for different
-- platforms separate.
ccToDir :: CCompiler -> String
ccToDir :: CCompiler -> String
ccToDir (GCC (Just String
s)) = String -> String
forall a. [a] -> [a]
reverse (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
1 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String
forall a. [a] -> [a]
reverse String
s) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/"
ccToDir CCompiler
_              = String
""

-- | The directory @~/.atspkg@
pkgHome :: MonadIO m => CCompiler -> m String
pkgHome :: CCompiler -> m String
pkgHome CCompiler
cc' = IO String -> m String
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> m String) -> IO String -> m String
forall a b. (a -> b) -> a -> b
$ (String -> String -> String
forall a. [a] -> [a] -> [a]
++ (String
"/.atspkg/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ CCompiler -> String
ccToDir CCompiler
cc')) (String -> String) -> IO String -> IO String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO String
getEnv String
"HOME"

fixDir :: FilePath -> String -> String
fixDir :: String -> String -> String
fixDir String
p =
      Text -> String
TL.unpack
    (Text -> String) -> (String -> Text) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
TL.replace (String -> Text
TL.pack String
"./") (String -> Text
TL.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/")
    (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
TL.replace (String -> Text
TL.pack String
"../") (String -> Text
TL.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ [String] -> String
joinPath ([String] -> [String]
forall a. [a] -> [a]
init ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ String -> [String]
splitPath String
p) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/")
    (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Text -> Text
TL.replace (String -> Text
TL.pack String
"$PATSHOMELOCS") (String -> Text
TL.pack String
".atspkg/contrib")
    (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
TL.pack