module Language.Drasil.Code.Imperative.Logging (
maybeLog, logBody, loggedMethod, varLogFile
) where
import Language.Drasil.Code.Imperative.DrasilState (GenState, DrasilState(..))
import Language.Drasil.Choices (Logging(..))
import GOOL.Drasil (Label, MSBody, MSBlock, SVariable, SValue, MSStatement,
OOProg, BodySym(..), BlockSym(..), TypeSym(..), VariableSym(..),
VariableElim(..), Literal(..), VariableValue(..), StatementSym(..),
DeclStatement(..), IOStatement(..), lensMStoVS)
import Control.Lens.Zoom (zoom)
import Control.Monad.State (get)
maybeLog :: (OOProg r) => SVariable r -> GenState [MSStatement r]
maybeLog :: SVariable r -> GenState [MSStatement r]
maybeLog v :: SVariable r
v = do
DrasilState
g <- StateT DrasilState Identity DrasilState
forall s (m :: * -> *). MonadState s m => m s
get
[StateT DrasilState Identity (MSStatement r)]
-> GenState [MSStatement r]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [SVariable r -> StateT DrasilState Identity (MSStatement r)
forall (r :: * -> *).
OOProg r =>
SVariable r -> GenState (MSStatement r)
loggedVar SVariable r
v | Logging
LogVar Logging -> [Logging] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` DrasilState -> [Logging]
logKind DrasilState
g]
loggedVar :: (OOProg r) => SVariable r -> GenState (MSStatement r)
loggedVar :: SVariable r -> GenState (MSStatement r)
loggedVar v :: SVariable r
v = do
DrasilState
g <- StateT DrasilState Identity DrasilState
forall s (m :: * -> *). MonadState s m => m s
get
MSStatement r -> GenState (MSStatement r)
forall (m :: * -> *) a. Monad m => a -> m a
return (MSStatement r -> GenState (MSStatement r))
-> MSStatement r -> GenState (MSStatement r)
forall a b. (a -> b) -> a -> b
$ [MSStatement r] -> MSStatement r
forall (r :: * -> *).
StatementSym r =>
[MSStatement r] -> MSStatement r
multi [
SVariable r -> SValue r -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SVariable r -> SValue r -> MSStatement r
openFileA SVariable r
forall (r :: * -> *). OOProg r => SVariable r
varLogFile (String -> SValue r
forall (r :: * -> *). Literal r => String -> SValue r
litString (String -> SValue r) -> String -> SValue r
forall a b. (a -> b) -> a -> b
$ DrasilState -> String
logName DrasilState
g),
LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
-> SVariable r -> StateT MethodState Identity (r (Variable r))
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
Lens' MethodState ValueState
lensMStoVS SVariable r
v StateT MethodState Identity (r (Variable r))
-> (r (Variable r) -> MSStatement r) -> MSStatement r
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\v' :: r (Variable r)
v' -> SValue r -> String -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStr SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile ("var '" String -> String -> String
forall a. [a] -> [a] -> [a]
++
r (Variable r) -> String
forall (r :: * -> *). VariableElim r => r (Variable r) -> String
variableName r (Variable r)
v' String -> String -> String
forall a. [a] -> [a] -> [a]
++ "' assigned ")),
SValue r -> SValue r -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SValue r -> SValue r -> MSStatement r
printFile SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (SVariable r -> SValue r
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable r
v),
SValue r -> String -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStrLn SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (" in module " String -> String -> String
forall a. [a] -> [a] -> [a]
++ DrasilState -> String
currentModule DrasilState
g),
SValue r -> MSStatement r
forall (r :: * -> *). IOStatement r => SValue r -> MSStatement r
closeFile SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile ]
logBody :: (OOProg r) => Label -> [SVariable r] -> [MSBlock r] ->
GenState (MSBody r)
logBody :: String -> [SVariable r] -> [MSBlock r] -> GenState (MSBody r)
logBody n :: String
n vars :: [SVariable r]
vars b :: [MSBlock r]
b = do
DrasilState
g <- StateT DrasilState Identity DrasilState
forall s (m :: * -> *). MonadState s m => m s
get
MSBody r -> GenState (MSBody r)
forall (m :: * -> *) a. Monad m => a -> m a
return (MSBody r -> GenState (MSBody r))
-> MSBody r -> GenState (MSBody r)
forall a b. (a -> b) -> a -> b
$ [MSBlock r] -> MSBody r
forall (r :: * -> *). BodySym r => [MSBlock r] -> MSBody r
body ([MSBlock r] -> MSBody r) -> [MSBlock r] -> MSBody r
forall a b. (a -> b) -> a -> b
$ [String -> String -> [SVariable r] -> MSBlock r
forall (r :: * -> *).
OOProg r =>
String -> String -> [SVariable r] -> MSBlock r
loggedMethod (DrasilState -> String
logName DrasilState
g) String
n [SVariable r]
vars | Logging
LogFunc Logging -> [Logging] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` DrasilState -> [Logging]
logKind DrasilState
g] [MSBlock r] -> [MSBlock r] -> [MSBlock r]
forall a. [a] -> [a] -> [a]
++ [MSBlock r]
b
loggedMethod :: (OOProg r) => FilePath -> Label -> [SVariable r] -> MSBlock r
loggedMethod :: String -> String -> [SVariable r] -> MSBlock r
loggedMethod lName :: String
lName n :: String
n vars :: [SVariable r]
vars = [MSStatement r] -> MSBlock r
forall (r :: * -> *). BlockSym r => [MSStatement r] -> MSBlock r
block [
SVariable r -> MSStatement r
forall (r :: * -> *).
DeclStatement r =>
SVariable r -> MSStatement r
varDec SVariable r
forall (r :: * -> *). OOProg r => SVariable r
varLogFile,
SVariable r -> SValue r -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SVariable r -> SValue r -> MSStatement r
openFileA SVariable r
forall (r :: * -> *). OOProg r => SVariable r
varLogFile (String -> SValue r
forall (r :: * -> *). Literal r => String -> SValue r
litString String
lName),
SValue r -> String -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStrLn SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile ("function " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ " called with inputs: {"),
[MSStatement r] -> MSStatement r
forall (r :: * -> *).
StatementSym r =>
[MSStatement r] -> MSStatement r
multi ([MSStatement r] -> MSStatement r)
-> [MSStatement r] -> MSStatement r
forall a b. (a -> b) -> a -> b
$ [SVariable r] -> [MSStatement r]
forall (r :: * -> *).
OOProg r =>
[StateT ValueState Identity (r (Variable r))]
-> [StateT MethodState Identity (r (Statement r))]
printInputs [SVariable r]
vars,
SValue r -> String -> MSStatement r
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStrLn SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile " }",
SValue r -> MSStatement r
forall (r :: * -> *). IOStatement r => SValue r -> MSStatement r
closeFile SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile ]
where
printInputs :: [StateT ValueState Identity (r (Variable r))]
-> [StateT MethodState Identity (r (Statement r))]
printInputs [] = []
printInputs [v :: StateT ValueState Identity (r (Variable r))
v] = [
LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
-> StateT ValueState Identity (r (Variable r))
-> StateT MethodState Identity (r (Variable r))
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
Lens' MethodState ValueState
lensMStoVS StateT ValueState Identity (r (Variable r))
v StateT MethodState Identity (r (Variable r))
-> (r (Variable r)
-> StateT MethodState Identity (r (Statement r)))
-> StateT MethodState Identity (r (Statement r))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\v' :: r (Variable r)
v' -> SValue r -> String -> StateT MethodState Identity (r (Statement r))
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStr SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (" " String -> String -> String
forall a. [a] -> [a] -> [a]
++
r (Variable r) -> String
forall (r :: * -> *). VariableElim r => r (Variable r) -> String
variableName r (Variable r)
v' String -> String -> String
forall a. [a] -> [a] -> [a]
++ " = ")),
SValue r
-> SValue r -> StateT MethodState Identity (r (Statement r))
forall (r :: * -> *).
IOStatement r =>
SValue r -> SValue r -> MSStatement r
printFileLn SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (StateT ValueState Identity (r (Variable r)) -> SValue r
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf StateT ValueState Identity (r (Variable r))
v)]
printInputs (v :: StateT ValueState Identity (r (Variable r))
v:vs :: [StateT ValueState Identity (r (Variable r))]
vs) = [
LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
-> StateT ValueState Identity (r (Variable r))
-> StateT MethodState Identity (r (Variable r))
forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom LensLike'
(Zoomed (StateT ValueState Identity) (r (Variable r)))
MethodState
ValueState
Lens' MethodState ValueState
lensMStoVS StateT ValueState Identity (r (Variable r))
v StateT MethodState Identity (r (Variable r))
-> (r (Variable r)
-> StateT MethodState Identity (r (Statement r)))
-> StateT MethodState Identity (r (Statement r))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\v' :: r (Variable r)
v' -> SValue r -> String -> StateT MethodState Identity (r (Statement r))
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStr SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (" " String -> String -> String
forall a. [a] -> [a] -> [a]
++
r (Variable r) -> String
forall (r :: * -> *). VariableElim r => r (Variable r) -> String
variableName r (Variable r)
v' String -> String -> String
forall a. [a] -> [a] -> [a]
++ " = ")),
SValue r
-> SValue r -> StateT MethodState Identity (r (Statement r))
forall (r :: * -> *).
IOStatement r =>
SValue r -> SValue r -> MSStatement r
printFile SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile (StateT ValueState Identity (r (Variable r)) -> SValue r
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf StateT ValueState Identity (r (Variable r))
v),
SValue r -> String -> StateT MethodState Identity (r (Statement r))
forall (r :: * -> *).
IOStatement r =>
SValue r -> String -> MSStatement r
printFileStrLn SValue r
forall (r :: * -> *). OOProg r => SValue r
valLogFile ", "] [StateT MethodState Identity (r (Statement r))]
-> [StateT MethodState Identity (r (Statement r))]
-> [StateT MethodState Identity (r (Statement r))]
forall a. [a] -> [a] -> [a]
++ [StateT ValueState Identity (r (Variable r))]
-> [StateT MethodState Identity (r (Statement r))]
printInputs [StateT ValueState Identity (r (Variable r))]
vs
varLogFile :: (OOProg r) => SVariable r
varLogFile :: SVariable r
varLogFile = String -> VSType r -> SVariable r
forall (r :: * -> *).
VariableSym r =>
String -> VSType r -> SVariable r
var "outfile" VSType r
forall (r :: * -> *). TypeSym r => VSType r
outfile
valLogFile :: (OOProg r) => SValue r
valLogFile :: SValue r
valLogFile = SVariable r -> SValue r
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable r
forall (r :: * -> *). OOProg r => SVariable r
varLogFile