-- | The logic to render Julia auxiliary files is contained in this module
module Language.Drasil.Code.Imperative.GOOL.LanguageRenderer.JuliaRenderer (
  JuliaProject(..)
) where

import Prelude hiding (break,print,(<>),sin,cos,tan,floor)
import Text.PrettyPrint.HughesPJ (empty)

import Drasil.GProc (jlName, jlVersion)

import Language.Drasil.Code.Imperative.GOOL.ClassInterface (AuxiliarySym(..), auxFromData)
import Language.Drasil.Code.Imperative.README (ReadMeInfo(..))
import qualified
  Language.Drasil.Code.Imperative.GOOL.LanguageRenderer.LanguagePolymorphic as
  G (readMe, makefile, noRunIfLib, docIfEnabled)
import Language.Drasil.Code.Imperative.Build.AST (Runnable, DocConfig(..), interpMM)

-- | Holds a Julia project
newtype JuliaProject a = JLP {forall a. JuliaProject a -> a
unJLP :: a}

instance Functor JuliaProject where
  fmap :: forall a b. (a -> b) -> JuliaProject a -> JuliaProject b
fmap a -> b
f (JLP a
x) = b -> JuliaProject b
forall a. a -> JuliaProject a
JLP (a -> b
f a
x)

instance Applicative JuliaProject where
  pure :: forall a. a -> JuliaProject a
pure = a -> JuliaProject a
forall a. a -> JuliaProject a
JLP
  (JLP a -> b
f) <*> :: forall a b.
JuliaProject (a -> b) -> JuliaProject a -> JuliaProject b
<*> (JLP a
x) = b -> JuliaProject b
forall a. a -> JuliaProject a
JLP (a -> b
f a
x)

instance Monad JuliaProject where
  JLP a
x >>= :: forall a b.
JuliaProject a -> (a -> JuliaProject b) -> JuliaProject b
>>= a -> JuliaProject b
f = a -> JuliaProject b
f a
x

instance AuxiliarySym JuliaProject where
  doxConfig :: String
-> SoftwareDossierState
-> Verbosity
-> JuliaProject FileAndContents
doxConfig String
_ SoftwareDossierState
_ Verbosity
_ = String -> Doc -> JuliaProject FileAndContents
forall (r :: * -> *).
Applicative r =>
String -> Doc -> r FileAndContents
auxFromData String
"" Doc
empty -- Doxygen does not support Julia
  readMe :: ReadMeInfo -> JuliaProject FileAndContents
readMe ReadMeInfo
rmi = ReadMeInfo -> JuliaProject FileAndContents
forall (r :: * -> *).
Applicative r =>
ReadMeInfo -> r FileAndContents
G.readMe ReadMeInfo
rmi {
        langName = jlName,
        langVersion = jlVersion}

  optimizeDox :: JuliaProject Doc
optimizeDox = String -> JuliaProject Doc
forall a. HasCallStack => String -> a
error String
doxError

  makefile :: [String]
-> ImplementationType
-> [Comments]
-> SoftwareDossierState
-> ProgData
-> JuliaProject FileAndContents
makefile [String]
_ ImplementationType
it [Comments]
cms = Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> SoftwareDossierState
-> ProgData
-> JuliaProject FileAndContents
forall (r :: * -> *).
Applicative r =>
Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> SoftwareDossierState
-> ProgData
-> r FileAndContents
G.makefile Maybe BuildConfig
forall a. Maybe a
Nothing (ImplementationType -> Maybe Runnable -> Maybe Runnable
G.noRunIfLib ImplementationType
it Maybe Runnable
jlRunnable)
                            ([Comments] -> DocConfig -> Maybe DocConfig
G.docIfEnabled [Comments]
cms (Dependencies -> [Command] -> DocConfig
DocConfig [] []))

  auxHelperDoc :: JuliaProject Doc -> Doc
auxHelperDoc = JuliaProject Doc -> Doc
forall a. JuliaProject a -> a
unJLP

-- | Default runnable information for Julia files
jlRunnable :: Maybe Runnable
jlRunnable :: Maybe Runnable
jlRunnable = String -> Maybe Runnable
interpMM String
"julia"

-- | Julia is not compatible with Doxygen, so raise an error if trying to compile Doxygen documentation.
doxError :: String
doxError :: String
doxError = String
jlName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" is not compatible with Doxygen."