{-# Language PatternGuards #-}

module CabalCargs.Format
   ( format
   ) where

import CabalCargs.CompilerArgs (CompilerArgs(..))
import CabalCargs.Formatting (Formatting(..))
import Data.Maybe (maybeToList)
import Data.List (foldl')


format :: Formatting -> CompilerArgs -> [String]
format :: Formatting -> CompilerArgs -> [String]
format Formatting
Ghc CompilerArgs
cargs = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [String] -> [String]
formatHsSourceDirs ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
hsSourceDirs CompilerArgs
cargs
                          , CompilerArgs -> [String]
ghcOptions CompilerArgs
cargs
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-X" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
defaultExtensions CompilerArgs
cargs)
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-X" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
defaultLanguage CompilerArgs
cargs)
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-optP" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
cppOptions CompilerArgs
cargs)
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-optc" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
ccOptions CompilerArgs
cargs)
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-L" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
extraLibDirs CompilerArgs
cargs)
                          , (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-l" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (CompilerArgs -> [String]
extraLibraries CompilerArgs
cargs)
                          , [String] -> [String]
formatIncludeDirs ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
includeDirs CompilerArgs
cargs
                          , [String] -> [String]
forall {t :: * -> *}. Foldable t => t String -> [String]
formatIncludes ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
includes CompilerArgs
cargs
                          , [String] -> [String]
formatBuildDepends ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
buildDepends CompilerArgs
cargs
                          , [String] -> (String -> [String]) -> Maybe String -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe []
                                  (\String
db -> [String
"-clear-package-db", String
"-global-package-db", String
"-package-db=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
db])
                                  (CompilerArgs -> Maybe String
packageDB CompilerArgs
cargs)
                          , [String] -> [String]
formatHsSourceDirs ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
autogenHsSourceDirs CompilerArgs
cargs
                          , [String] -> [String]
formatIncludeDirs ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
autogenIncludeDirs CompilerArgs
cargs
                          , [String] -> [String]
forall {t :: * -> *}. Foldable t => t String -> [String]
formatIncludes ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> [String]
autogenIncludes CompilerArgs
cargs
                          ]
   where
      formatBuildDepends :: [String] -> [String]
formatBuildDepends []   = []
      formatBuildDepends [String]
deps = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-package=" String -> String -> String
forall a. [a] -> [a] -> [a]
++) [String]
deps

      formatHsSourceDirs :: [String] -> [String]
formatHsSourceDirs = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-i" String -> String -> String
forall a. [a] -> [a] -> [a]
++)
      formatIncludeDirs :: [String] -> [String]
formatIncludeDirs  = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-I" String -> String -> String
forall a. [a] -> [a] -> [a]
++)

      formatIncludes :: t String -> [String]
formatIncludes t String
incs = [String] -> [String]
forall a. [a] -> [a]
reverse ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ ([String] -> String -> [String])
-> [String] -> t String -> [String]
forall b a. (b -> a -> b) -> b -> t a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' [String] -> String -> [String]
addInclude [] t String
incs
         where
            addInclude :: [String] -> String -> [String]
addInclude [String]
incs String
inc = (String
"-optP" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
inc) String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String
"-optP-include") String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
incs


format Formatting
Hdevtools CompilerArgs
cargs = ((String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"-g" String -> String -> String
forall a. [a] -> [a] -> [a]
++) (Formatting -> CompilerArgs -> [String]
format Formatting
Ghc CompilerArgs
cargs)) [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
socket
   where
      socket :: [String]
socket = [String] -> (String -> [String]) -> Maybe String -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\String
s -> [String
"--socket=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s]) (CompilerArgs -> Maybe String
hdevtoolsSocket CompilerArgs
cargs)


format Formatting
Pure CompilerArgs
cargs = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ CompilerArgs -> [String]
hsSourceDirs CompilerArgs
cargs
                           , CompilerArgs -> [String]
ghcOptions CompilerArgs
cargs
                           , CompilerArgs -> [String]
defaultExtensions CompilerArgs
cargs
                           , CompilerArgs -> [String]
defaultLanguage CompilerArgs
cargs
                           , CompilerArgs -> [String]
cppOptions CompilerArgs
cargs
                           , CompilerArgs -> [String]
cSources CompilerArgs
cargs
                           , CompilerArgs -> [String]
ccOptions CompilerArgs
cargs
                           , CompilerArgs -> [String]
extraLibDirs CompilerArgs
cargs
                           , CompilerArgs -> [String]
extraLibraries CompilerArgs
cargs
                           , CompilerArgs -> [String]
ldOptions CompilerArgs
cargs
                           , CompilerArgs -> [String]
includeDirs CompilerArgs
cargs
                           , CompilerArgs -> [String]
includes CompilerArgs
cargs
                           , CompilerArgs -> [String]
buildDepends CompilerArgs
cargs
                           , Maybe String -> [String]
forall a. Maybe a -> [a]
maybeToList (Maybe String -> [String]) -> Maybe String -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> Maybe String
packageDB CompilerArgs
cargs
                           , Maybe String -> [String]
forall a. Maybe a -> [a]
maybeToList (Maybe String -> [String]) -> Maybe String -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> Maybe String
rootDir CompilerArgs
cargs
                           , CompilerArgs -> [String]
autogenHsSourceDirs CompilerArgs
cargs
                           , CompilerArgs -> [String]
autogenIncludeDirs CompilerArgs
cargs
                           , CompilerArgs -> [String]
autogenIncludes CompilerArgs
cargs
                           , Maybe String -> [String]
forall a. Maybe a -> [a]
maybeToList (Maybe String -> [String]) -> Maybe String -> [String]
forall a b. (a -> b) -> a -> b
$ CompilerArgs -> Maybe String
hdevtoolsSocket CompilerArgs
cargs
                           ]