-- | The logic to render Python auxiliary files is contained in this module
module Language.Drasil.Code.Imperative.GOOL.LanguageRenderer.PythonRenderer (
  PythonProject(..)
) where

import Prelude hiding (break,print,sin,cos,tan,floor,(<>))

import Drasil.GOOL (pyName, pyVersion)

import Language.Drasil.SoftwareDossier.SoftwareDossierSym (SoftwareDossierSym(..))
import Language.Drasil.Code.Imperative.README (ReadMeInfo(..))

import qualified
  Language.Drasil.Code.Imperative.GOOL.LanguageRenderer.LanguagePolymorphic as
  G (doxConfig, readMe, makefile, noRunIfLib, doxDocConfig,
  docIfEnabled)
import Language.Drasil.Code.Imperative.Build.AST (Runnable, interpMM)
import Language.Drasil.Code.Imperative.Doxygen.Import (yes)

-- | Holds a Python project.
newtype PythonProject a = PP {forall a. PythonProject a -> a
unPP :: a}

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

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

instance Monad PythonProject where
  PP a
x >>= :: forall a b.
PythonProject a -> (a -> PythonProject b) -> PythonProject b
>>= a -> PythonProject b
f = a -> PythonProject b
f a
x

instance SoftwareDossierSym PythonProject where
  doxConfig :: String
-> SoftwareDossierState
-> Verbosity
-> Maybe (PythonProject FileLayout)
doxConfig String
n SoftwareDossierState
s Verbosity
v = PythonProject FileLayout -> Maybe (PythonProject FileLayout)
forall a. a -> Maybe a
Just (PythonProject FileLayout -> Maybe (PythonProject FileLayout))
-> PythonProject FileLayout -> Maybe (PythonProject FileLayout)
forall a b. (a -> b) -> a -> b
$ PythonProject Doc
-> String
-> SoftwareDossierState
-> Verbosity
-> PythonProject FileLayout
forall (r :: * -> *).
(SoftwareDossierSym r, Applicative r) =>
r Doc
-> String -> SoftwareDossierState -> Verbosity -> r FileLayout
G.doxConfig PythonProject Doc
forall (r :: * -> *). SoftwareDossierSym r => r Doc
optimizeDox String
n SoftwareDossierState
s Verbosity
v
  readMe :: ReadMeInfo -> PythonProject FileLayout
readMe ReadMeInfo
rmi =
    ReadMeInfo -> PythonProject FileLayout
forall (r :: * -> *). Applicative r => ReadMeInfo -> r FileLayout
G.readMe ReadMeInfo
rmi {
        langName = pyName,
        langVersion = pyVersion}

  optimizeDox :: PythonProject Doc
optimizeDox = Doc -> PythonProject Doc
forall a. a -> PythonProject a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Doc
yes

  makefile :: [String]
-> ImplementationType
-> [Comments]
-> SoftwareDossierState
-> ProgData
-> PythonProject FileLayout
makefile [String]
_ ImplementationType
it [Comments]
cms = Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> SoftwareDossierState
-> ProgData
-> PythonProject FileLayout
forall (r :: * -> *).
Applicative r =>
Maybe BuildConfig
-> Maybe Runnable
-> Maybe DocConfig
-> SoftwareDossierState
-> ProgData
-> r FileLayout
G.makefile Maybe BuildConfig
forall a. Maybe a
Nothing (ImplementationType -> Maybe Runnable -> Maybe Runnable
G.noRunIfLib ImplementationType
it Maybe Runnable
pyRunnable)
    ([Comments] -> DocConfig -> Maybe DocConfig
G.docIfEnabled [Comments]
cms DocConfig
G.doxDocConfig)

  unReprDoc :: PythonProject Doc -> Doc
unReprDoc = PythonProject Doc -> Doc
forall a. PythonProject a -> a
unPP

-- | Default runnable information for Python files.
pyRunnable :: Maybe Runnable
pyRunnable :: Maybe Runnable
pyRunnable = String -> Maybe Runnable
interpMM String
"python3"