{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}

-- | MVP renderer for logging statements.

module Drasil.Shared.LanguageRenderer.LoggingFor (LoggingFor(..)) where

import Drasil.Shared.InterfaceCommon (VSType, TypeSym(..), VariableSym(..),
  VariableValue(..), ValueSym(..), Literal(..), IndexTranslator(..), Array(..),
  VariableElim(..))
import Drasil.GOOL.InterfaceGOOL (OOTypeSym(..), OOVariableSym(..), SelfSym(..),
  InstanceVarSelfSym(..))
import Drasil.Shared.AST (TypeData(..), td)
import Drasil.Shared.CodeType (CodeType(..))
import Drasil.GOOL.CodeInfoOO (CodeInfoOO)
import Drasil.GOOL.LanguageRenderer.JavaRenderer (JavaCode)
import Drasil.GOOL.LanguageRenderer.CSharpRenderer (CSharpCode)
import Drasil.GOOL.LanguageRenderer.CppRenderer (CppCode, CppSrcCode, CppHdrCode)
import Drasil.GOOL.LanguageRenderer.PythonRenderer (PythonCode)
import Drasil.GOOL.LanguageRenderer.SwiftRenderer (SwiftCode)
import Drasil.Shared.LanguageRenderer (dot)

import Text.PrettyPrint.HughesPJ (Doc, text, empty, comma, space, brackets,
  braces, punctuate, hcat)
import qualified Text.PrettyPrint.HughesPJ as P (char, integer, float, double)
import Data.Kind (Type)

newtype LoggingFor (lang :: Type -> Type) a = LC {forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC :: a} deriving (forall a b. (a -> b) -> LoggingFor lang a -> LoggingFor lang b)
-> (forall a b. a -> LoggingFor lang b -> LoggingFor lang a)
-> Functor (LoggingFor lang)
forall a b. a -> LoggingFor lang b -> LoggingFor lang a
forall a b. (a -> b) -> LoggingFor lang a -> LoggingFor lang b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (lang :: * -> *) a b.
a -> LoggingFor lang b -> LoggingFor lang a
forall (lang :: * -> *) a b.
(a -> b) -> LoggingFor lang a -> LoggingFor lang b
$cfmap :: forall (lang :: * -> *) a b.
(a -> b) -> LoggingFor lang a -> LoggingFor lang b
fmap :: forall a b. (a -> b) -> LoggingFor lang a -> LoggingFor lang b
$c<$ :: forall (lang :: * -> *) a b.
a -> LoggingFor lang b -> LoggingFor lang a
<$ :: forall a b. a -> LoggingFor lang b -> LoggingFor lang a
Functor

instance Applicative (LoggingFor lang) where
  pure :: forall a. a -> LoggingFor lang a
pure = a -> LoggingFor lang a
forall (lang :: * -> *) a. a -> LoggingFor lang a
LC
  (LC a -> b
f) <*> :: forall a b.
LoggingFor lang (a -> b) -> LoggingFor lang a -> LoggingFor lang b
<*> (LC a
x) = b -> LoggingFor lang b
forall (lang :: * -> *) a. a -> LoggingFor lang a
LC (a -> b
f a
x)

instance Monad (LoggingFor lang) where
  LC a
x >>= :: forall a b.
LoggingFor lang a -> (a -> LoggingFor lang b) -> LoggingFor lang b
>>= a -> LoggingFor lang b
f = a -> LoggingFor lang b
f a
x

instance VariableSym (LoggingFor lang) where
  type Variable (LoggingFor lang) = Doc
  var :: Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
var Library
n VSType (LoggingFor lang)
_ = LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang (Variable (LoggingFor lang))
 -> SVariable (LoggingFor lang))
-> LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
n
  constant :: Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
constant Library
n VSType (LoggingFor lang)
_ = LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang (Variable (LoggingFor lang))
 -> SVariable (LoggingFor lang))
-> LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
n
  extVar :: Library
-> Library
-> VSType (LoggingFor lang)
-> SVariable (LoggingFor lang)
extVar Library
l Library
n VSType (LoggingFor lang)
_ = LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang (Variable (LoggingFor lang))
 -> SVariable (LoggingFor lang))
-> LoggingFor lang (Variable (LoggingFor lang))
-> SVariable (LoggingFor lang)
forall a b. (a -> b) -> a -> b
$ Variable (LoggingFor lang)
-> LoggingFor lang (Variable (LoggingFor lang))
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Variable (LoggingFor lang)
 -> LoggingFor lang (Variable (LoggingFor lang)))
-> Variable (LoggingFor lang)
-> LoggingFor lang (Variable (LoggingFor lang))
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
l Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Library -> Doc
text Library
n

instance OOVariableSym (LoggingFor lang) where
  classVar :: Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
classVar = Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
forall (r :: * -> *).
VariableSym r =>
Library -> VSType r -> SVariable r
var
  classConst :: Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
classConst = Library -> VSType (LoggingFor lang) -> SVariable (LoggingFor lang)
forall (r :: * -> *).
VariableSym r =>
Library -> VSType r -> SVariable r
constant
  classVarAccess :: VSType (LoggingFor lang)
-> SVariable (LoggingFor lang) -> SVariable (LoggingFor lang)
classVarAccess VSType (LoggingFor lang)
cls SVariable (LoggingFor lang)
vr = do
    LoggingFor lang TypeData
cls' <- VSType (LoggingFor lang)
cls
    LoggingFor lang Doc
vr' <- StateT ValueState Identity (LoggingFor lang Doc)
SVariable (LoggingFor lang)
vr
    let clsDoc :: Doc
clsDoc = (TypeData -> Doc
typeDoc (TypeData -> Doc)
-> (LoggingFor lang TypeData -> TypeData)
-> LoggingFor lang TypeData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LoggingFor lang TypeData -> TypeData
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC) LoggingFor lang TypeData
cls'
        vrDoc :: Doc
vrDoc = LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor lang Doc
vr'
    LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ Doc
clsDoc Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
vrDoc
  extClassVarAccess :: VSType (LoggingFor lang)
-> SVariable (LoggingFor lang) -> SVariable (LoggingFor lang)
extClassVarAccess = VSType (LoggingFor lang)
-> SVariable (LoggingFor lang) -> SVariable (LoggingFor lang)
forall (r :: * -> *).
OOVariableSym r =>
VSType r -> SVariable r -> SVariable r
classVarAccess
  instanceVarAccess :: SValue (LoggingFor lang)
-> SVariable (LoggingFor lang) -> SVariable (LoggingFor lang)
instanceVarAccess SValue (LoggingFor lang)
ob SVariable (LoggingFor lang)
vr = do
    LoggingFor lang Doc
ob' <- StateT ValueState Identity (LoggingFor lang Doc)
SValue (LoggingFor lang)
ob
    LoggingFor lang Doc
vr' <- StateT ValueState Identity (LoggingFor lang Doc)
SVariable (LoggingFor lang)
vr
    LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor lang Doc
ob' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor lang Doc
vr'

instance SelfSym (LoggingFor CodeInfoOO) where
  self :: SVariable (LoggingFor CodeInfoOO)
self = LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
-> SVariable (LoggingFor CodeInfoOO)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
 -> SVariable (LoggingFor CodeInfoOO))
-> LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
-> SVariable (LoggingFor CodeInfoOO)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor CodeInfoOO Doc
forall a. a -> LoggingFor CodeInfoOO a
forall (m :: * -> *) a. Monad m => a -> m a
return Doc
empty

instance InstanceVarSelfSym (LoggingFor CodeInfoOO) where
  instanceVarSelf :: SVariable (LoggingFor CodeInfoOO)
-> SVariable (LoggingFor CodeInfoOO)
instanceVarSelf SVariable (LoggingFor CodeInfoOO)
_ = LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
-> SVariable (LoggingFor CodeInfoOO)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
 -> SVariable (LoggingFor CodeInfoOO))
-> LoggingFor CodeInfoOO (Variable (LoggingFor CodeInfoOO))
-> SVariable (LoggingFor CodeInfoOO)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor CodeInfoOO Doc
forall a. a -> LoggingFor CodeInfoOO a
forall (m :: * -> *) a. Monad m => a -> m a
return Doc
empty

instance SelfSym (LoggingFor JavaCode) where
  self :: SVariable (LoggingFor JavaCode)
self = LoggingFor JavaCode (Variable (LoggingFor JavaCode))
-> SVariable (LoggingFor JavaCode)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor JavaCode (Variable (LoggingFor JavaCode))
 -> SVariable (LoggingFor JavaCode))
-> LoggingFor JavaCode (Variable (LoggingFor JavaCode))
-> SVariable (LoggingFor JavaCode)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor JavaCode Doc
forall a. a -> LoggingFor JavaCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor JavaCode Doc) -> Doc -> LoggingFor JavaCode Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
"this"

instance InstanceVarSelfSym (LoggingFor JavaCode) where
  instanceVarSelf :: SVariable (LoggingFor JavaCode) -> SVariable (LoggingFor JavaCode)
instanceVarSelf SVariable (LoggingFor JavaCode)
vr = do
    LoggingFor JavaCode Doc
vr' <- StateT ValueState Identity (LoggingFor JavaCode Doc)
SVariable (LoggingFor JavaCode)
vr
    LoggingFor JavaCode Doc
self' <- forall (r :: * -> *). SelfSym r => SVariable r
self @(LoggingFor JavaCode)
    LoggingFor JavaCode Doc
-> StateT ValueState Identity (LoggingFor JavaCode Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor JavaCode Doc
 -> StateT ValueState Identity (LoggingFor JavaCode Doc))
-> LoggingFor JavaCode Doc
-> StateT ValueState Identity (LoggingFor JavaCode Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor JavaCode Doc
forall a. a -> LoggingFor JavaCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor JavaCode Doc) -> Doc -> LoggingFor JavaCode Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor JavaCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor JavaCode Doc
self' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor JavaCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor JavaCode Doc
vr'

instance SelfSym (LoggingFor CSharpCode) where
  self :: SVariable (LoggingFor CSharpCode)
self = LoggingFor CSharpCode (Variable (LoggingFor CSharpCode))
-> SVariable (LoggingFor CSharpCode)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor CSharpCode (Variable (LoggingFor CSharpCode))
 -> SVariable (LoggingFor CSharpCode))
-> LoggingFor CSharpCode (Variable (LoggingFor CSharpCode))
-> SVariable (LoggingFor CSharpCode)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor CSharpCode Doc
forall a. a -> LoggingFor CSharpCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor CSharpCode Doc)
-> Doc -> LoggingFor CSharpCode Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
"this"

instance InstanceVarSelfSym (LoggingFor CSharpCode) where
  instanceVarSelf :: SVariable (LoggingFor CSharpCode)
-> SVariable (LoggingFor CSharpCode)
instanceVarSelf SVariable (LoggingFor CSharpCode)
vr = do
    LoggingFor CSharpCode Doc
vr' <- StateT ValueState Identity (LoggingFor CSharpCode Doc)
SVariable (LoggingFor CSharpCode)
vr
    LoggingFor CSharpCode Doc
self' <- forall (r :: * -> *). SelfSym r => SVariable r
self @(LoggingFor CSharpCode)
    LoggingFor CSharpCode Doc
-> StateT ValueState Identity (LoggingFor CSharpCode Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor CSharpCode Doc
 -> StateT ValueState Identity (LoggingFor CSharpCode Doc))
-> LoggingFor CSharpCode Doc
-> StateT ValueState Identity (LoggingFor CSharpCode Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor CSharpCode Doc
forall a. a -> LoggingFor CSharpCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor CSharpCode Doc)
-> Doc -> LoggingFor CSharpCode Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor CSharpCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor CSharpCode Doc
self' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor CSharpCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor CSharpCode Doc
vr'

instance SelfSym (LoggingFor (CppCode CppSrcCode CppHdrCode)) where
  self :: SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
self = LoggingFor
  (CppCode CppSrcCode CppHdrCode)
  (Variable (LoggingFor (CppCode CppSrcCode CppHdrCode)))
-> SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor
   (CppCode CppSrcCode CppHdrCode)
   (Variable (LoggingFor (CppCode CppSrcCode CppHdrCode)))
 -> SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode)))
-> LoggingFor
     (CppCode CppSrcCode CppHdrCode)
     (Variable (LoggingFor (CppCode CppSrcCode CppHdrCode)))
-> SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
forall a. a -> LoggingFor (CppCode CppSrcCode CppHdrCode) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc)
-> Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
"self"

instance InstanceVarSelfSym (LoggingFor (CppCode CppSrcCode CppHdrCode)) where
  instanceVarSelf :: SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
-> SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
instanceVarSelf SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
vr = do
    LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
vr' <- StateT
  ValueState
  Identity
  (LoggingFor (CppCode CppSrcCode CppHdrCode) Doc)
SVariable (LoggingFor (CppCode CppSrcCode CppHdrCode))
vr
    LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
self' <- forall (r :: * -> *). SelfSym r => SVariable r
self @(LoggingFor (CppCode CppSrcCode CppHdrCode))
    LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
-> StateT
     ValueState
     Identity
     (LoggingFor (CppCode CppSrcCode CppHdrCode) Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
 -> StateT
      ValueState
      Identity
      (LoggingFor (CppCode CppSrcCode CppHdrCode) Doc))
-> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
-> StateT
     ValueState
     Identity
     (LoggingFor (CppCode CppSrcCode CppHdrCode) Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
forall a. a -> LoggingFor (CppCode CppSrcCode CppHdrCode) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc)
-> Doc -> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor (CppCode CppSrcCode CppHdrCode) Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
self' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Library -> Doc
text Library
"->" Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor (CppCode CppSrcCode CppHdrCode) Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor (CppCode CppSrcCode CppHdrCode) Doc
vr'

instance SelfSym (LoggingFor PythonCode) where
  self :: SVariable (LoggingFor PythonCode)
self = LoggingFor PythonCode (Variable (LoggingFor PythonCode))
-> SVariable (LoggingFor PythonCode)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor PythonCode (Variable (LoggingFor PythonCode))
 -> SVariable (LoggingFor PythonCode))
-> LoggingFor PythonCode (Variable (LoggingFor PythonCode))
-> SVariable (LoggingFor PythonCode)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor PythonCode Doc
forall a. a -> LoggingFor PythonCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor PythonCode Doc)
-> Doc -> LoggingFor PythonCode Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
"self"

instance InstanceVarSelfSym (LoggingFor PythonCode) where
  instanceVarSelf :: SVariable (LoggingFor PythonCode)
-> SVariable (LoggingFor PythonCode)
instanceVarSelf SVariable (LoggingFor PythonCode)
vr = do
    LoggingFor PythonCode Doc
vr' <- StateT ValueState Identity (LoggingFor PythonCode Doc)
SVariable (LoggingFor PythonCode)
vr
    LoggingFor PythonCode Doc
self' <- forall (r :: * -> *). SelfSym r => SVariable r
self @(LoggingFor PythonCode)
    LoggingFor PythonCode Doc
-> StateT ValueState Identity (LoggingFor PythonCode Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor PythonCode Doc
 -> StateT ValueState Identity (LoggingFor PythonCode Doc))
-> LoggingFor PythonCode Doc
-> StateT ValueState Identity (LoggingFor PythonCode Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor PythonCode Doc
forall a. a -> LoggingFor PythonCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor PythonCode Doc)
-> Doc -> LoggingFor PythonCode Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor PythonCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor PythonCode Doc
self' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor PythonCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor PythonCode Doc
vr'

instance SelfSym (LoggingFor SwiftCode) where
  self :: SVariable (LoggingFor SwiftCode)
self = LoggingFor SwiftCode (Variable (LoggingFor SwiftCode))
-> SVariable (LoggingFor SwiftCode)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor SwiftCode (Variable (LoggingFor SwiftCode))
 -> SVariable (LoggingFor SwiftCode))
-> LoggingFor SwiftCode (Variable (LoggingFor SwiftCode))
-> SVariable (LoggingFor SwiftCode)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor SwiftCode Doc
forall a. a -> LoggingFor SwiftCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor SwiftCode Doc)
-> Doc -> LoggingFor SwiftCode Doc
forall a b. (a -> b) -> a -> b
$ Library -> Doc
text Library
"self"

instance InstanceVarSelfSym (LoggingFor SwiftCode) where
  instanceVarSelf :: SVariable (LoggingFor SwiftCode)
-> SVariable (LoggingFor SwiftCode)
instanceVarSelf SVariable (LoggingFor SwiftCode)
vr = do
    LoggingFor SwiftCode Doc
vr' <- StateT ValueState Identity (LoggingFor SwiftCode Doc)
SVariable (LoggingFor SwiftCode)
vr
    LoggingFor SwiftCode Doc
self' <- forall (r :: * -> *). SelfSym r => SVariable r
self @(LoggingFor SwiftCode)
    LoggingFor SwiftCode Doc
-> StateT ValueState Identity (LoggingFor SwiftCode Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor SwiftCode Doc
 -> StateT ValueState Identity (LoggingFor SwiftCode Doc))
-> LoggingFor SwiftCode Doc
-> StateT ValueState Identity (LoggingFor SwiftCode Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor SwiftCode Doc
forall a. a -> LoggingFor SwiftCode a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor SwiftCode Doc)
-> Doc -> LoggingFor SwiftCode Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor SwiftCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor SwiftCode Doc
self' Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
dot Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> LoggingFor SwiftCode Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor SwiftCode Doc
vr'

instance ValueSym (LoggingFor lang) where
  type Value (LoggingFor lang) = Doc
  valueType :: LoggingFor lang (Value (LoggingFor lang))
-> LoggingFor lang TypeData
valueType = Library -> LoggingFor lang Doc -> LoggingFor lang TypeData
forall a. HasCallStack => Library -> a
error Library
"Not implemented"

instance TypeSym (LoggingFor lang) where
  bool :: VSType (LoggingFor lang)
bool = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
bool
  int :: VSType (LoggingFor lang)
int = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
int
  float :: VSType (LoggingFor lang)
float = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
float
  double :: VSType (LoggingFor lang)
double = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
double
  char :: VSType (LoggingFor lang)
char = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
char
  string :: VSType (LoggingFor lang)
string = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
string
  infile :: VSType (LoggingFor lang)
infile = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
infile
  outfile :: VSType (LoggingFor lang)
outfile = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
outfile
  listType :: VSType (LoggingFor lang) -> VSType (LoggingFor lang)
listType = VSType (LoggingFor lang) -> VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r -> VSType r
listType
  setType :: VSType (LoggingFor lang) -> VSType (LoggingFor lang)
setType = VSType (LoggingFor lang) -> VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r -> VSType r
setType
  arrayType :: VSType (LoggingFor lang) -> VSType (LoggingFor lang)
arrayType = VSType (LoggingFor lang) -> VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r -> VSType r
arrayType
  listInnerType :: VSType (LoggingFor lang) -> VSType (LoggingFor lang)
listInnerType = VSType (LoggingFor lang) -> VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r -> VSType r
listInnerType
  funcType :: [VSType (LoggingFor lang)]
-> VSType (LoggingFor lang) -> VSType (LoggingFor lang)
funcType = [VSType (LoggingFor lang)]
-> VSType (LoggingFor lang) -> VSType (LoggingFor lang)
forall (r :: * -> *).
TypeSym r =>
[VSType r] -> VSType r -> VSType r
funcType
  void :: VSType (LoggingFor lang)
void = VSType (LoggingFor lang)
forall (r :: * -> *). TypeSym r => VSType r
void

instance OOTypeSym (LoggingFor lang) where
  obj :: Library -> VSType (LoggingFor lang)
obj Library
nm = CodeType -> Library -> VSType (LoggingFor lang)
forall (lang :: * -> *).
CodeType -> Library -> VSType (LoggingFor lang)
typeFromData (Library -> CodeType
Object Library
nm) (Library
"Object<" Library -> Library -> Library
forall a. [a] -> [a] -> [a]
++ Library
nm Library -> Library -> Library
forall a. [a] -> [a] -> [a]
++ Library
">")

typeFromData :: CodeType -> String -> VSType (LoggingFor lang)
typeFromData :: forall (lang :: * -> *).
CodeType -> Library -> VSType (LoggingFor lang)
typeFromData CodeType
tp Library
str = LoggingFor lang TypeData
-> StateT ValueState Identity (LoggingFor lang TypeData)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang TypeData
 -> StateT ValueState Identity (LoggingFor lang TypeData))
-> LoggingFor lang TypeData
-> StateT ValueState Identity (LoggingFor lang TypeData)
forall a b. (a -> b) -> a -> b
$ TypeData -> LoggingFor lang TypeData
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (TypeData -> LoggingFor lang TypeData)
-> TypeData -> LoggingFor lang TypeData
forall a b. (a -> b) -> a -> b
$ CodeType -> Library -> Doc -> TypeData
td CodeType
tp Library
str (Library -> Doc
text Library
str)

instance Literal (LoggingFor lang) where
  litTrue :: SValue (LoggingFor lang)
litTrue = Library -> SValue (LoggingFor lang)
forall (r :: * -> *). Literal r => Library -> SValue r
litString Library
"True"
  litFalse :: SValue (LoggingFor lang)
litFalse = Library -> SValue (LoggingFor lang)
forall (r :: * -> *). Literal r => Library -> SValue r
litString Library
"False"
  litChar :: Char -> SValue (LoggingFor lang)
litChar = LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> (Char -> LoggingFor lang Doc)
-> Char
-> StateT ValueState Identity (LoggingFor lang Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc)
-> (Char -> Doc) -> Char -> LoggingFor lang Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Doc
P.char
  litDouble :: Double -> SValue (LoggingFor lang)
litDouble = LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> (Double -> LoggingFor lang Doc)
-> Double
-> StateT ValueState Identity (LoggingFor lang Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc)
-> (Double -> Doc) -> Double -> LoggingFor lang Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Doc
P.double
  litFloat :: Float -> SValue (LoggingFor lang)
litFloat = LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> (Float -> LoggingFor lang Doc)
-> Float
-> StateT ValueState Identity (LoggingFor lang Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc)
-> (Float -> Doc) -> Float -> LoggingFor lang Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float -> Doc
P.float
  litInt :: Integer -> SValue (LoggingFor lang)
litInt = LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> (Integer -> LoggingFor lang Doc)
-> Integer
-> StateT ValueState Identity (LoggingFor lang Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc)
-> (Integer -> Doc) -> Integer -> LoggingFor lang Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Doc
P.integer
  litString :: Library -> SValue (LoggingFor lang)
litString = LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> (Library -> LoggingFor lang Doc)
-> Library
-> StateT ValueState Identity (LoggingFor lang Doc)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc)
-> (Library -> Doc) -> Library -> LoggingFor lang Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Library -> Doc
text
  litArray :: VSType (LoggingFor lang)
-> [SValue (LoggingFor lang)] -> SValue (LoggingFor lang)
litArray VSType (LoggingFor lang)
_ [SValue (LoggingFor lang)]
vs = do
    [LoggingFor lang Doc]
vs' <- [StateT ValueState Identity (LoggingFor lang Doc)]
-> StateT ValueState Identity [LoggingFor lang Doc]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [StateT ValueState Identity (LoggingFor lang Doc)]
[SValue (LoggingFor lang)]
vs
    let docs :: [Doc]
docs = (LoggingFor lang Doc -> Doc) -> [LoggingFor lang Doc] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC [LoggingFor lang Doc]
vs'
    LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ Doc -> Doc
brackets (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
hcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> [Doc] -> [Doc]
punctuate (Doc
comma Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
space) [Doc]
docs
  litList :: VSType (LoggingFor lang)
-> [SValue (LoggingFor lang)] -> SValue (LoggingFor lang)
litList = VSType (LoggingFor lang)
-> [SValue (LoggingFor lang)] -> SValue (LoggingFor lang)
forall (r :: * -> *).
Literal r =>
VSType r -> [SValue r] -> SValue r
litArray
  litSet :: VSType (LoggingFor lang)
-> [SValue (LoggingFor lang)] -> SValue (LoggingFor lang)
litSet VSType (LoggingFor lang)
_ [SValue (LoggingFor lang)]
vs = do
    [LoggingFor lang Doc]
vs' <- [StateT ValueState Identity (LoggingFor lang Doc)]
-> StateT ValueState Identity [LoggingFor lang Doc]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [StateT ValueState Identity (LoggingFor lang Doc)]
[SValue (LoggingFor lang)]
vs
    let docs :: [Doc]
docs = (LoggingFor lang Doc -> Doc) -> [LoggingFor lang Doc] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC [LoggingFor lang Doc]
vs'
    LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ Doc -> Doc
braces (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
hcat ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ Doc -> [Doc] -> [Doc]
punctuate (Doc
comma Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
space) [Doc]
docs

instance IndexTranslator (LoggingFor lang) where
  intToIndex :: SValue (LoggingFor lang) -> SValue (LoggingFor lang)
intToIndex = VS (LoggingFor lang Doc) -> VS (LoggingFor lang Doc)
SValue (LoggingFor lang) -> SValue (LoggingFor lang)
forall a. a -> a
id
  indexToInt :: SValue (LoggingFor lang) -> SValue (LoggingFor lang)
indexToInt = VS (LoggingFor lang Doc) -> VS (LoggingFor lang Doc)
SValue (LoggingFor lang) -> SValue (LoggingFor lang)
forall a. a -> a
id

instance Array (LoggingFor lang) where
  arrayElem :: SValue (LoggingFor lang)
-> SVariable (LoggingFor lang) -> SVariable (LoggingFor lang)
arrayElem SValue (LoggingFor lang)
idx' SVariable (LoggingFor lang)
vr' = do
    LoggingFor lang Doc
idx <- StateT ValueState Identity (LoggingFor lang Doc)
SValue (LoggingFor lang)
idx'
    LoggingFor lang Doc
vr <- StateT ValueState Identity (LoggingFor lang Doc)
SVariable (LoggingFor lang)
vr'
    LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a. a -> StateT ValueState Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (LoggingFor lang Doc
 -> StateT ValueState Identity (LoggingFor lang Doc))
-> LoggingFor lang Doc
-> StateT ValueState Identity (LoggingFor lang Doc)
forall a b. (a -> b) -> a -> b
$ Doc -> LoggingFor lang Doc
forall a. a -> LoggingFor lang a
forall (m :: * -> *) a. Monad m => a -> m a
return (Doc -> LoggingFor lang Doc) -> Doc -> LoggingFor lang Doc
forall a b. (a -> b) -> a -> b
$ LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor lang Doc
idx Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc -> Doc
brackets (LoggingFor lang Doc -> Doc
forall (lang :: * -> *) a. LoggingFor lang a -> a
unLC LoggingFor lang Doc
vr)
  arrayLength :: SValue (LoggingFor lang) -> SValue (LoggingFor lang)
arrayLength = StateT ValueState Identity (LoggingFor lang Doc)
-> StateT ValueState Identity (LoggingFor lang Doc)
SValue (LoggingFor lang) -> SValue (LoggingFor lang)
forall a. HasCallStack => a
undefined
  arrayCopy :: SValue (LoggingFor lang) -> SValue (LoggingFor lang)
arrayCopy = StateT ValueState Identity (LoggingFor lang Doc)
-> StateT ValueState Identity (LoggingFor lang Doc)
SValue (LoggingFor lang) -> SValue (LoggingFor lang)
forall a. HasCallStack => a
undefined

-- Not Implemented
instance VariableElim (LoggingFor lang) where
  variableName :: LoggingFor lang (Variable (LoggingFor lang)) -> Library
variableName = LoggingFor lang Doc -> Library
LoggingFor lang (Variable (LoggingFor lang)) -> Library
forall a. HasCallStack => a
undefined
  variableType :: LoggingFor lang (Variable (LoggingFor lang))
-> LoggingFor lang TypeData
variableType = LoggingFor lang Doc -> LoggingFor lang TypeData
LoggingFor lang (Variable (LoggingFor lang))
-> LoggingFor lang TypeData
forall a. HasCallStack => a
undefined

instance VariableValue (LoggingFor lang) where
  valueOf :: SVariable (LoggingFor lang) -> SValue (LoggingFor lang)
valueOf = VS (LoggingFor lang Doc) -> VS (LoggingFor lang Doc)
SVariable (LoggingFor lang) -> SValue (LoggingFor lang)
forall a. a -> a
id