{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PostfixOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}

-- | The logic to render C# code is contained in this module
module Drasil.GOOL.LanguageRenderer.CSharpRenderer (
  -- * C# Code Configuration -- defines syntax of all C# code
  CSharpCode(..), csName, csVersion
) where

import Drasil.FileHandling.Legacy (indent)

import Drasil.Shared.CodeType (CodeType(..))
import Drasil.Shared.InterfaceCommon (UnRepr(..), SharedProg, SharedStatement,
  Label, Body, SVariable, Value, SValue, BodySym(..), oneLiner, BlockSym(..),
  TypeSym(..), TypeElim(..), getTypeString, VariableSym(..), VisibilitySym(..),
  VariableElim(..), ValueSym(..), Argument(..), Literal(..), MathConstant(..),
  VariableValue(..), CommandLineArgs(..), NumericExpression(..),
  BooleanExpression(..), Comparison(..), ValueExpression(..), funcApp,
  extFuncApp, IndexTranslator(..), Reference(..), Array(..), List(..), Set(..),
  InternalList(..), StatementSym(..), AssignStatement(..), (&=),
  DeclStatement(..), IOStatement(..), StringStatement(..), FunctionSym,
  FuncAppStatement(..), CommentStatement(..), BinderSym(..), BinderElim(..),
  ControlStatement(..), ScopeSym(..), ParameterSym(..), MethodSym(..))
import Drasil.GOOL.InterfaceGOOL (OOProg, OOStatement, StateVar, ProgramSym(..),
  FileSym(..), ModuleSym(..), ClassSym(..), OOTypeSym(..), OOVariableSym(..),
  SelfSym(..), StateVarSym(..), AttachmentSym(..), OOValueSym, OOVariableValue,
  OOValueExpression(..), selfMethodCall, newObj, InternalValueExp(..),
  objMethodCall, objMethodCallNoParams, OOFunctionSym(..), ($.), GetSet(..),
  OODeclStatement(..), OOFuncAppStatement(..), ObserverPattern(..),
  StrategyPattern(..), OOMethodSym(..))
import Drasil.Shared.RendererClassesCommon (CommonRenderSym, ImportSym(..),
  RenderBody(..), BodyElim, RenderBlock(..), BlockElim, RenderType(..),
  UnaryOpSym(..), BinaryOpSym(..), OpElim(uOpPrec, bOpPrec), RenderVariable(..),
  InternalVarElim(variableBind), RenderValue(..), ValueElim(valuePrec, valueInt),
  InternalListFunc(..), RenderFunction(..), FunctionElim(functionType),
  InternalAssignStmt(..), InternalIOStmt(..), InternalControlStmt(..),
  RenderStatement(..), StatementElim(statementTerm), RenderVisibility(..),
  VisibilityElim, MethodTypeSym(..), RenderParam(..),
  ParamElim(parameterName, parameterType), RenderMethod(..), MethodElim,
  BlockCommentSym(..), BlockCommentElim, ScopeElim(..), InternalBinderElim(..))
import qualified Drasil.Shared.RendererClassesCommon as RC (body, block, uOp,
  bOp, variable, value, function, statement, visibility, parameter, method,
  blockComment')
import Drasil.GOOL.RendererClassesOO (OORenderSym, RenderFile(..),
  PermElim(binding), InternalGetSet(..), OOMethodTypeSym(..),
  OORenderMethod(..), StateVarElim, RenderClass(..), ClassElim, RenderMod(..),
  ModuleElim)
import qualified Drasil.GOOL.RendererClassesOO as RC (perm, stateVar, class',
  module')
import Drasil.GOOL.Renderers (renderType, renderParam, renderMethod,
  renderListDec)
import Drasil.Shared.LanguageRenderer (new, dot, blockCmtStart, blockCmtEnd,
  docCmtStart, bodyStart, bodyEnd, endStatement, commentStart, elseIfLabel,
  inLabel, tryLabel, catchLabel, throwLabel, exceptionObj', new', listSep',
  args, nullLabel, listSep, access, containing, mathFunc, valueList,
  variableList, binderList, appendToBody, surroundBody)
import qualified Drasil.Shared.LanguageRenderer as R (class', multiStmt, body,
  printFile, classVarAccess, cast, castObj, classLevel,
  instanceLevel, break, continue, private, public, blockCmt, docCmt, addComments,
  commentedMod, commentedItem)
import Drasil.Shared.LanguageRenderer.Constructors (mkStmt,  mkStmtNoEnd,
  mkStateVal, mkVal, typeFromData, VSOp, unOpPrec, powerPrec, unExpr, unExpr',
  unExprNumDbl, typeUnExpr, binExpr, binExprNumDbl', typeBinExpr)
import qualified Drasil.Shared.LanguageRenderer.LanguagePolymorphic as G (
  multiBody, block, multiBlock, obj, csc, sec, cot, negateOp, equalOp,
  notEqualOp, greaterOp, greaterEqualOp, lessOp, lessEqualOp, plusOp, minusOp,
  multOp, divideOp, moduloOp, var, classVar, instanceVarAccess, arrayElem,
  litChar, litDouble, litInt, litString, valueOf, arg, argsList, objAccess,
  objMethodCall, call, funcAppMixedArgs, newObjMixedArgs, lambda, func, get, set,
  listAccess, getFunc, setFunc, stmt, loopStmt, emptyStmt, assign, subAssign,
  objDecNew, print, closeFile, returnStmt, valStmt, comment, throw, ifCond,
  tryCatch, construct, param, method, getMethod, setMethod, function, buildClass,
  implementingClass, commentedClass, modFromData, fileDoc, fileFromData,
  defaultOptSpace, local)
import qualified Drasil.Shared.LanguageRenderer.CommonPseudoOO as CP (
  arrayDec, arrayDecDef, arrayType, bindingError, buildModule', classVarAccess,
  constVar, constructor, contains, destructorError, discardFileLine, docInOutFunc,
  docMain, doubleRender, doxClass, doxFunc, doxMod, extraClass, forEach, global,
  implements, indexOf, indexToInt, inherit, int, intClass, intToIndex,
  listDecDef, listSet, mainFunction, notNull, openFileA, openFileR, openFileW,
  pi, printSt, setMethodCall, stateVar, stateVarDef, string)
import qualified Drasil.GOOL.LanguageRenderer.CommonGOOL as CG (constDecDef,
  classMethodCall, listAppend, listAdd, innerType)

import qualified Drasil.Shared.LanguageRenderer.CLike as C (setType, float,
  double, char, listType, void, notOp, andOp, orOp, self, litTrue, litFalse,
  litFloat, inlineIf, libFuncAppMixedArgs, libNewObjMixedArgs, listSize',
  increment, increment1, decrement1, varDec, varDecDef, listDec, extObjDecNew,
  switch, for, while, intFunc, multiAssignError, multiReturnError,
  multiTypeError)
import qualified Drasil.Shared.LanguageRenderer.Macros as M (ifExists,
  runStrategy, listSlice, stringListVals, stringListLists, forRange,
  notifyObservers)
import Drasil.Shared.AST (Terminator(..), FileType(..), fileD, FuncData(..), fd,
  ModData(..), md, updateMod, MethodData(..), mthd, updateMthd, OpData(..),
  ParamData(..), pd, updateParam, ProgData(..), progD, TypeData(..), ValData(..),
  vd, updateValDoc, AttachmentTag(..), VarData(..), vard, ScopeData, BinderD(..),
  bindFormD)
import Drasil.Shared.Helpers (angles, hicat, toCode, toState, onCodeValue,
  onStateValue, on2CodeValues, on2StateValues, on3CodeValues, on3StateValues,
  on2StateWrapped, onCodeList, onStateList)
import Drasil.Shared.State (MS, VS, lensGStoFS, lensMStoVS, modifyReturn,
  revFiles, addLangImport, addLangImportVS, setFileType, getClassName,
  setCurrMain, useVarName, setVarScope)

import Prelude hiding (break,print,(<>),sin,cos,tan,floor)
import Control.Lens.Zoom (zoom)
import Control.Monad (join)
import Control.Monad.State (modify)
import Data.Composition ((.:))
import Data.List (intercalate)
import Text.PrettyPrint.HughesPJ (Doc, text, (<>), (<+>), ($$), parens, empty,
  equals, vcat, lbrace, rbrace, braces, colon, space, quotes, semi)
import qualified Drasil.Shared.LanguageRenderer.Common as CS (
  extFuncAppMixedArgs, extVar, listAccessFunc)

csExt :: String
csExt :: String
csExt = String
"cs"

newtype CSharpCode a = CSC {forall a. CSharpCode a -> a
unCSC :: a} deriving CSharpCode a -> CSharpCode a -> Bool
(CSharpCode a -> CSharpCode a -> Bool)
-> (CSharpCode a -> CSharpCode a -> Bool) -> Eq (CSharpCode a)
forall a. Eq a => CSharpCode a -> CSharpCode a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => CSharpCode a -> CSharpCode a -> Bool
== :: CSharpCode a -> CSharpCode a -> Bool
$c/= :: forall a. Eq a => CSharpCode a -> CSharpCode a -> Bool
/= :: CSharpCode a -> CSharpCode a -> Bool
Eq

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

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

instance Monad CSharpCode where
  CSC a
x >>= :: forall a b. CSharpCode a -> (a -> CSharpCode b) -> CSharpCode b
>>= a -> CSharpCode b
f = a -> CSharpCode b
f a
x

instance SharedProg CSharpCode Doc (Doc, Terminator) MethodData
instance SharedStatement CSharpCode (Doc, Terminator)
instance OOStatement CSharpCode (Doc, Terminator)
instance OOProg CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc ProgData

instance ProgramSym CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc ProgData where
  prog :: String
-> String
-> [FS (CSharpCode File)]
-> GSProgram CSharpCode ProgData
prog String
n String
st [FS (CSharpCode File)]
files = do
    [CSharpCode File]
fs <- (FS (CSharpCode File)
 -> StateT GOOLState Identity (CSharpCode File))
-> [FS (CSharpCode File)]
-> StateT GOOLState Identity [CSharpCode File]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LensLike'
  (Zoomed (StateT FileState Identity) (CSharpCode File))
  GOOLState
  FileState
-> FS (CSharpCode File)
-> StateT GOOLState Identity (CSharpCode File)
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) GOOLState FileState
-> StateT FileState Identity c -> StateT GOOLState Identity c
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 FileState Identity) (CSharpCode File))
  GOOLState
  FileState
(FileState -> Focusing Identity (CSharpCode File) FileState)
-> GOOLState -> Focusing Identity (CSharpCode File) GOOLState
Lens' GOOLState FileState
lensGStoFS) [FS (CSharpCode File)]
files
    (GOOLState -> GOOLState) -> StateT GOOLState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify GOOLState -> GOOLState
revFiles
    CSharpCode ProgData -> GSProgram CSharpCode ProgData
forall a. a -> StateT GOOLState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CSharpCode ProgData -> GSProgram CSharpCode ProgData)
-> CSharpCode ProgData -> GSProgram CSharpCode ProgData
forall a b. (a -> b) -> a -> b
$ ([File] -> ProgData) -> [CSharpCode File] -> CSharpCode ProgData
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList (String -> String -> [File] -> ProgData
progD String
n String
st) [CSharpCode File]
fs

instance CommonRenderSym CSharpCode Doc (Doc, Terminator) MethodData
instance OORenderSym CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc

instance UnRepr CSharpCode contents where
  unRepr :: CSharpCode contents -> contents
unRepr = CSharpCode contents -> contents
forall a. CSharpCode a -> a
unCSC

instance FileSym CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc where
  fileDoc :: FS (CSharpCode Module) -> FS (CSharpCode File)
fileDoc FS (CSharpCode Module)
m = do
    (FileState -> FileState) -> StateT FileState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (FileType -> FileState -> FileState
setFileType FileType
Combined)
    String
-> (CSharpCode Module -> CSharpCode Doc)
-> CSharpCode Doc
-> FS (CSharpCode Module)
-> FS (CSharpCode File)
forall (r :: * -> *).
(BlockElim r, RenderMod r, RenderFile r) =>
String
-> (r Module -> r Doc) -> r Doc -> FS (r Module) -> FS (r File)
G.fileDoc String
csExt CSharpCode Module -> CSharpCode Doc
forall (r :: * -> *). RenderFile r => r Module -> r Doc
top CSharpCode Doc
forall (r :: * -> *). RenderFile r => r Doc
bottom FS (CSharpCode Module)
m

  docMod :: String
-> String
-> [String]
-> String
-> FS (CSharpCode File)
-> FS (CSharpCode File)
docMod = String
-> String
-> String
-> [String]
-> String
-> FS (CSharpCode File)
-> FS (CSharpCode File)
forall (r :: * -> *).
RenderFile r =>
String
-> String
-> String
-> [String]
-> String
-> FS (r File)
-> FS (r File)
CP.doxMod String
csExt

instance RenderFile CSharpCode where
  top :: CSharpCode Module -> CSharpCode Doc
top CSharpCode Module
_ = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty
  bottom :: CSharpCode Doc
bottom = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty

  commentedMod :: FS (CSharpCode File) -> FS (CSharpCode Doc) -> FS (CSharpCode File)
commentedMod = (CSharpCode File -> CSharpCode Doc -> CSharpCode File)
-> FS (CSharpCode File)
-> FS (CSharpCode Doc)
-> FS (CSharpCode File)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((File -> Doc -> File)
-> CSharpCode File -> CSharpCode Doc -> CSharpCode File
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues File -> Doc -> File
R.commentedMod)

  fileFromData :: String -> FS (CSharpCode Module) -> FS (CSharpCode File)
fileFromData = (String -> CSharpCode Module -> CSharpCode File)
-> String -> FS (CSharpCode Module) -> FS (CSharpCode File)
forall (r :: * -> *).
ModuleElim r =>
(String -> r Module -> r File)
-> String -> FS (r Module) -> FS (r File)
G.fileFromData ((Module -> File) -> CSharpCode Module -> CSharpCode File
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Module -> File) -> CSharpCode Module -> CSharpCode File)
-> (String -> Module -> File)
-> String
-> CSharpCode Module
-> CSharpCode File
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Module -> File
fileD)

instance ImportSym CSharpCode where
  langImport :: String -> CSharpCode Doc
langImport = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> CSharpCode Doc)
-> (String -> Doc) -> String -> CSharpCode Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
csImport
  modImport :: String -> CSharpCode Doc
modImport = String -> CSharpCode Doc
forall (r :: * -> *). ImportSym r => String -> r Doc
langImport

instance AttachmentSym CSharpCode Doc where
  classLevel :: CSharpCode Doc
classLevel = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.classLevel
  instanceLevel :: CSharpCode Doc
instanceLevel = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.instanceLevel

instance PermElim CSharpCode Doc where
  perm :: CSharpCode Doc -> Doc
perm = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC
  binding :: CSharpCode Doc -> AttachmentTag
binding = String -> CSharpCode Doc -> AttachmentTag
forall a. HasCallStack => String -> a
error (String -> CSharpCode Doc -> AttachmentTag)
-> String -> CSharpCode Doc -> AttachmentTag
forall a b. (a -> b) -> a -> b
$ String -> String
CP.bindingError String
csName

instance BodySym CSharpCode (Doc, Terminator) where
  body :: [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
body = ([CSharpCode Doc] -> CSharpCode Doc)
-> [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([Doc] -> Doc) -> [CSharpCode Doc] -> CSharpCode Doc
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [Doc] -> Doc
R.body)

  addComments :: String -> MS (CSharpCode Doc) -> MS (CSharpCode Doc)
addComments String
s = (CSharpCode Doc -> CSharpCode Doc)
-> MS (CSharpCode Doc) -> MS (CSharpCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc) -> CSharpCode Doc -> CSharpCode Doc
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (String -> Doc -> Doc -> Doc
R.addComments String
s Doc
commentStart))

instance RenderBody CSharpCode where
  multiBody :: [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
multiBody = [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
forall (r :: * -> *).
(BodyElim r, Monad r) =>
[MS (r Doc)] -> MS (r Doc)
G.multiBody

instance BodyElim CSharpCode where
  body :: CSharpCode Doc -> Doc
body = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

instance BlockSym CSharpCode (Doc, Terminator) where
  block :: [MS (CSharpCode (Doc, Terminator))] -> MS (CSharpCode Doc)
block = [MS (CSharpCode (Doc, Terminator))] -> MS (CSharpCode Doc)
forall (r :: * -> *) smt.
(Monad r, RenderStatement r smt, StatementElim r smt) =>
[MS (r smt)] -> MS (r Doc)
G.block

instance RenderBlock CSharpCode where
  multiBlock :: [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
multiBlock = [MS (CSharpCode Doc)] -> MS (CSharpCode Doc)
forall (r :: * -> *).
(BlockElim r, Monad r) =>
[MS (r Doc)] -> MS (r Doc)
G.multiBlock

instance BlockElim CSharpCode where
  block :: CSharpCode Doc -> Doc
block = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

instance TypeSym CSharpCode where
  bool :: VS (CSharpCode TypeData)
bool = VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall a. VS a -> VS a
addSystemImport VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
csBoolType
  int :: VS (CSharpCode TypeData)
int = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.int
  float :: VS (CSharpCode TypeData)
float = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.float
  double :: VS (CSharpCode TypeData)
double = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.double
  char :: VS (CSharpCode TypeData)
char = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.char
  string :: VS (CSharpCode TypeData)
string = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.string
  infile :: VS (CSharpCode TypeData)
infile = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
csInfileType
  outfile :: VS (CSharpCode TypeData)
outfile = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
csOutfileType
  referenceType :: VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
referenceType = VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall a. a -> a
id -- Ignore reference types in "high-level" langauges for now; later on think about using boxed/unboxed types
  listType :: VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
listType VS (CSharpCode TypeData)
t = do
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS String
csGeneric)
    String -> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
csList VS (CSharpCode TypeData)
t
  arrayType :: VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
arrayType = VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
(TypeElim r, Monad r, UnRepr r TypeData) =>
VS (r TypeData) -> VS (r TypeData)
CP.arrayType
  setType :: VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
setType VS (CSharpCode TypeData)
t = do
    (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS String
csGeneric)
    String -> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
csSet VS (CSharpCode TypeData)
t
  innerType :: VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
innerType = VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
(TypeElim r, OOTypeSym r) =>
VS (r TypeData) -> VS (r TypeData)
CG.innerType
  funcType :: [VS (CSharpCode TypeData)]
-> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
funcType = [VS (CSharpCode TypeData)]
-> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
csFuncType
  void :: VS (CSharpCode TypeData)
void = VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.void

instance TypeElim CSharpCode where
  getCodeType :: CSharpCode TypeData -> CodeType
getCodeType = TypeData -> CodeType
cType (TypeData -> CodeType)
-> (CSharpCode TypeData -> TypeData)
-> CSharpCode TypeData
-> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode TypeData -> TypeData
forall a. CSharpCode a -> a
unCSC

instance OOTypeSym CSharpCode where
  obj :: String -> VS (CSharpCode TypeData)
obj = String -> VS (CSharpCode TypeData)
forall (r :: * -> *). Monad r => String -> VS (r TypeData)
G.obj

instance RenderType CSharpCode where
  multiType :: [VS (CSharpCode TypeData)] -> VS (CSharpCode TypeData)
multiType [VS (CSharpCode TypeData)]
_ = String -> VS (CSharpCode TypeData)
forall a. HasCallStack => String -> a
error (String -> VS (CSharpCode TypeData))
-> String -> VS (CSharpCode TypeData)
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiTypeError String
csName

instance UnaryOpSym CSharpCode where
  notOp :: VSUnOp CSharpCode
notOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
C.notOp
  negateOp :: VSUnOp CSharpCode
negateOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.negateOp
  sqrtOp :: VSUnOp CSharpCode
sqrtOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Sqrt"
  absOp :: VSUnOp CSharpCode
absOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Abs"
  logOp :: VSUnOp CSharpCode
logOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Log10"
  lnOp :: VSUnOp CSharpCode
lnOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Log"
  expOp :: VSUnOp CSharpCode
expOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Exp"
  sinOp :: VSUnOp CSharpCode
sinOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Sin"
  cosOp :: VSUnOp CSharpCode
cosOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Cos"
  tanOp :: VSUnOp CSharpCode
tanOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Tan"
  asinOp :: VSUnOp CSharpCode
asinOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Asin"
  acosOp :: VSUnOp CSharpCode
acosOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Acos"
  atanOp :: VSUnOp CSharpCode
atanOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Atan"
  floorOp :: VSUnOp CSharpCode
floorOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Floor"
  ceilOp :: VSUnOp CSharpCode
ceilOp = String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath String
"Ceiling"

instance BinaryOpSym CSharpCode where
  equalOp :: VSUnOp CSharpCode
equalOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.equalOp
  notEqualOp :: VSUnOp CSharpCode
notEqualOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.notEqualOp
  greaterOp :: VSUnOp CSharpCode
greaterOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterOp
  greaterEqualOp :: VSUnOp CSharpCode
greaterEqualOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterEqualOp
  lessOp :: VSUnOp CSharpCode
lessOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.lessOp
  lessEqualOp :: VSUnOp CSharpCode
lessEqualOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.lessEqualOp
  plusOp :: VSUnOp CSharpCode
plusOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.plusOp
  minusOp :: VSUnOp CSharpCode
minusOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.minusOp
  multOp :: VSUnOp CSharpCode
multOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.multOp
  divideOp :: VSUnOp CSharpCode
divideOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.divideOp
  powerOp :: VSUnOp CSharpCode
powerOp = VSUnOp CSharpCode -> VSUnOp CSharpCode
forall a. VS a -> VS a
addSystemImport (VSUnOp CSharpCode -> VSUnOp CSharpCode)
-> VSUnOp CSharpCode -> VSUnOp CSharpCode
forall a b. (a -> b) -> a -> b
$ String -> VSUnOp CSharpCode
forall (r :: * -> *). Monad r => String -> VSOp r
powerPrec (String -> VSUnOp CSharpCode) -> String -> VSUnOp CSharpCode
forall a b. (a -> b) -> a -> b
$ String -> String
mathFunc String
"Pow"
  moduloOp :: VSUnOp CSharpCode
moduloOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
G.moduloOp
  andOp :: VSUnOp CSharpCode
andOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
C.andOp
  orOp :: VSUnOp CSharpCode
orOp = VSUnOp CSharpCode
forall (r :: * -> *). Monad r => VSOp r
C.orOp

instance OpElim CSharpCode where
  uOp :: CSharpCode OpData -> Doc
uOp = OpData -> Doc
opDoc (OpData -> Doc)
-> (CSharpCode OpData -> OpData) -> CSharpCode OpData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode OpData -> OpData
forall a. CSharpCode a -> a
unCSC
  bOp :: CSharpCode OpData -> Doc
bOp = OpData -> Doc
opDoc (OpData -> Doc)
-> (CSharpCode OpData -> OpData) -> CSharpCode OpData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode OpData -> OpData
forall a. CSharpCode a -> a
unCSC
  uOpPrec :: CSharpCode OpData -> Int
uOpPrec = OpData -> Int
opPrec (OpData -> Int)
-> (CSharpCode OpData -> OpData) -> CSharpCode OpData -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode OpData -> OpData
forall a. CSharpCode a -> a
unCSC
  bOpPrec :: CSharpCode OpData -> Int
bOpPrec = OpData -> Int
opPrec (OpData -> Int)
-> (CSharpCode OpData -> OpData) -> CSharpCode OpData -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode OpData -> OpData
forall a. CSharpCode a -> a
unCSC

instance ScopeSym CSharpCode where
  global :: CSharpCode ScopeData
global = CSharpCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
CP.global
  mainFn :: CSharpCode ScopeData
mainFn = CSharpCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local
  local :: CSharpCode ScopeData
local = CSharpCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
G.local

instance ScopeElim CSharpCode where
  scopeData :: CSharpCode ScopeData -> ScopeData
scopeData = CSharpCode ScopeData -> ScopeData
forall a. CSharpCode a -> a
unCSC

instance VariableSym CSharpCode where
  var :: String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
var         = String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
RenderVariable r =>
String -> VS (r TypeData) -> SVariable r
G.var
  constant :: String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
constant    = String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
VariableSym r =>
String -> VS (r TypeData) -> SVariable r
var
  extVar :: String
-> String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
extVar      = String
-> String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
RenderVariable r =>
String -> String -> VS (r TypeData) -> SVariable r
CS.extVar

instance OOVariableSym CSharpCode where
  classVar :: String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
classVar = String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
RenderVariable r =>
String -> VS (r TypeData) -> SVariable r
G.classVar
  classConst :: String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
classConst = String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
OOVariableSym r =>
String -> VS (r TypeData) -> SVariable r
classVar
  classVarAccess :: VS (CSharpCode TypeData)
-> SVariable CSharpCode -> SVariable CSharpCode
classVarAccess = (Doc -> Doc -> Doc)
-> VS (CSharpCode TypeData)
-> SVariable CSharpCode
-> SVariable CSharpCode
forall (r :: * -> *).
(InternalVarElim r, RenderVariable r, UnRepr r TypeData,
 VariableElim r) =>
(Doc -> Doc -> Doc)
-> VS (r TypeData) -> SVariable r -> SVariable r
CP.classVarAccess Doc -> Doc -> Doc
R.classVarAccess
  extClassVarAccess :: VS (CSharpCode TypeData)
-> SVariable CSharpCode -> SVariable CSharpCode
extClassVarAccess = VS (CSharpCode TypeData)
-> SVariable CSharpCode -> SVariable CSharpCode
forall (r :: * -> *).
OOVariableSym r =>
VS (r TypeData) -> SVariable r -> SVariable r
classVarAccess
  instanceVarAccess :: SValue CSharpCode -> SVariable CSharpCode -> SVariable CSharpCode
instanceVarAccess = SValue CSharpCode -> SVariable CSharpCode -> SVariable CSharpCode
forall (r :: * -> *).
(InternalVarElim r, RenderVariable r, ValueElim r,
 VariableElim r) =>
SValue r -> SVariable r -> SVariable r
G.instanceVarAccess

instance SelfSym CSharpCode where
  self :: SVariable CSharpCode
self = SVariable CSharpCode
forall (r :: * -> *).
(OOTypeSym r, RenderVariable r) =>
SVariable r
C.self

instance VariableElim CSharpCode where
  variableName :: CSharpCode Variable -> String
variableName = Variable -> String
varName (Variable -> String)
-> (CSharpCode Variable -> Variable)
-> CSharpCode Variable
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Variable -> Variable
forall a. CSharpCode a -> a
unCSC
  variableType :: CSharpCode Variable -> CSharpCode TypeData
variableType = (Variable -> TypeData)
-> CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Variable -> TypeData
varType

instance InternalVarElim CSharpCode where
  variableBind :: CSharpCode Variable -> AttachmentTag
variableBind = Variable -> AttachmentTag
varBind (Variable -> AttachmentTag)
-> (CSharpCode Variable -> Variable)
-> CSharpCode Variable
-> AttachmentTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Variable -> Variable
forall a. CSharpCode a -> a
unCSC
  variable :: CSharpCode Variable -> Doc
variable = Variable -> Doc
varDoc (Variable -> Doc)
-> (CSharpCode Variable -> Variable) -> CSharpCode Variable -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Variable -> Variable
forall a. CSharpCode a -> a
unCSC

instance RenderVariable CSharpCode where
  varFromData :: AttachmentTag
-> String
-> VS (CSharpCode TypeData)
-> Doc
-> SVariable CSharpCode
varFromData AttachmentTag
b String
n VS (CSharpCode TypeData)
t' Doc
d = do
    CSharpCode TypeData
t <- VS (CSharpCode TypeData)
t'
    CSharpCode Variable -> SVariable CSharpCode
forall a s. a -> State s a
toState (CSharpCode Variable -> SVariable CSharpCode)
-> CSharpCode Variable -> SVariable CSharpCode
forall a b. (a -> b) -> a -> b
$ (TypeData -> Doc -> Variable)
-> CSharpCode TypeData -> CSharpCode Doc -> CSharpCode Variable
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues (AttachmentTag -> String -> TypeData -> Doc -> Variable
vard AttachmentTag
b String
n) CSharpCode TypeData
t (Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ValueSym CSharpCode where
  valueType :: CSharpCode Value -> CSharpCode TypeData
valueType = (Value -> TypeData) -> CSharpCode Value -> CSharpCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Value -> TypeData
valType

instance OOValueSym CSharpCode

instance Argument CSharpCode where
  pointerArg :: SValue CSharpCode -> SValue CSharpCode
pointerArg = SValue CSharpCode -> SValue CSharpCode
forall a. a -> a
id

instance Literal CSharpCode where
  litTrue :: SValue CSharpCode
litTrue = SValue CSharpCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
C.litTrue
  litFalse :: SValue CSharpCode
litFalse = SValue CSharpCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
C.litFalse
  litChar :: Char -> SValue CSharpCode
litChar = (Doc -> Doc) -> Char -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
(Doc -> Doc) -> Char -> SValue r
G.litChar Doc -> Doc
quotes
  litDouble :: Double -> SValue CSharpCode
litDouble = Double -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Double -> SValue r
G.litDouble
  litFloat :: Float -> SValue CSharpCode
litFloat = Float -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Float -> SValue r
C.litFloat
  litInt :: Integer -> SValue CSharpCode
litInt = Integer -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
Integer -> SValue r
G.litInt
  litString :: String -> SValue CSharpCode
litString = String -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
String -> SValue r
G.litString
  litArray :: VS (CSharpCode TypeData)
-> [SValue CSharpCode] -> SValue CSharpCode
litArray = (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData))
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
csLitList VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
arrayType
  litSet :: VS (CSharpCode TypeData)
-> [SValue CSharpCode] -> SValue CSharpCode
litSet = (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData))
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
csLitList VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
setType
  litList :: VS (CSharpCode TypeData)
-> [SValue CSharpCode] -> SValue CSharpCode
litList = (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData))
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
csLitList VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType

instance MathConstant CSharpCode where
  pi :: SValue CSharpCode
pi = SValue CSharpCode
forall (r :: * -> *). (RenderValue r, TypeSym r) => SValue r
CP.pi

instance VariableValue CSharpCode where
  valueOf :: SVariable CSharpCode -> SValue CSharpCode
valueOf = SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(InternalVarElim r, RenderValue r, VariableElim r) =>
SVariable r -> SValue r
G.valueOf

instance OOVariableValue CSharpCode

instance CommandLineArgs CSharpCode where
  arg :: Integer -> SValue CSharpCode
arg Integer
n = SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r, ValueElim r) =>
SValue r -> SValue r -> SValue r
G.arg (Integer -> SValue CSharpCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n) SValue CSharpCode
forall (r :: * -> *). CommandLineArgs r => SValue r
argsList
  argsList :: SValue CSharpCode
argsList = String -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, TypeSym r) =>
String -> SValue r
G.argsList String
args
  argExists :: Integer -> SValue CSharpCode
argExists Integer
i = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *) smt. List r smt => SValue r -> SValue r
listSize SValue CSharpCode
forall (r :: * -> *). CommandLineArgs r => SValue r
argsList SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
Comparison r =>
SValue r -> SValue r -> SValue r
?> Integer -> SValue CSharpCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt (Integer -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i)

instance NumericExpression CSharpCode where
  #~ :: SValue CSharpCode -> SValue CSharpCode
(#~) = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr' VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
negateOp
  #/^ :: SValue CSharpCode -> SValue CSharpCode
(#/^) = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sqrtOp
  #| :: SValue CSharpCode -> SValue CSharpCode
(#|) = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
absOp
  #+ :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#+) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
plusOp
  #- :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#-) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
minusOp
  #* :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#*) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
multOp
  #/ :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#/) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
divideOp
  #% :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#%) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
moduloOp
  #^ :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(#^) = VSUnOp CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExprNumDbl' VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
powerOp

  log :: SValue CSharpCode -> SValue CSharpCode
log = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
logOp
  ln :: SValue CSharpCode -> SValue CSharpCode
ln = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
lnOp
  exp :: SValue CSharpCode -> SValue CSharpCode
exp = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
expOp
  sin :: SValue CSharpCode -> SValue CSharpCode
sin = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sinOp
  cos :: SValue CSharpCode -> SValue CSharpCode
cos = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
cosOp
  tan :: SValue CSharpCode -> SValue CSharpCode
tan = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
tanOp
  csc :: SValue CSharpCode -> SValue CSharpCode
csc = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.csc
  sec :: SValue CSharpCode -> SValue CSharpCode
sec = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.sec
  cot :: SValue CSharpCode -> SValue CSharpCode
cot = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(Literal r, NumericExpression r, TypeElim r) =>
SValue r -> SValue r
G.cot
  arcsin :: SValue CSharpCode -> SValue CSharpCode
arcsin = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
asinOp
  arccos :: SValue CSharpCode -> SValue CSharpCode
arccos = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
acosOp
  arctan :: SValue CSharpCode -> SValue CSharpCode
arctan = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, TypeElim r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExprNumDbl VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
atanOp
  floor :: SValue CSharpCode -> SValue CSharpCode
floor = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
floorOp
  ceil :: SValue CSharpCode -> SValue CSharpCode
ceil = VSUnOp CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r, ValueSym r) =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
ceilOp

instance BooleanExpression CSharpCode where
  ?! :: SValue CSharpCode -> SValue CSharpCode
(?!) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSUnOp r -> VS (r TypeData) -> SValue r -> SValue r
typeUnExpr VSUnOp CSharpCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
notOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?&& :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?&&) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
andOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?|| :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?||) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
orOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool

instance Comparison CSharpCode where
  ?< :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?<) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?<= :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?<=) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessEqualOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?> :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?>) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?>= :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?>=) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterEqualOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?== :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?==) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
equalOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool
  ?!= :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
(?!=) = VSUnOp CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(OpElim r, RenderValue r, ValueElim r) =>
VSBinOp r -> VS (r TypeData) -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp CSharpCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
notEqualOp VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool

instance ValueExpression CSharpCode where
  inlineIf :: SValue CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
inlineIf = SValue CSharpCode
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, ValueElim r, ValueSym r) =>
SValue r -> SValue r -> SValue r -> SValue r
C.inlineIf

  funcAppMixedArgs :: MixedCall CSharpCode
funcAppMixedArgs = MixedCall CSharpCode
forall (r :: * -> *). RenderValue r => MixedCall r
G.funcAppMixedArgs
  extFuncAppMixedArgs :: String -> MixedCall CSharpCode
extFuncAppMixedArgs = String -> MixedCall CSharpCode
forall (r :: * -> *). RenderValue r => String -> MixedCall r
CS.extFuncAppMixedArgs
  libFuncAppMixedArgs :: String -> MixedCall CSharpCode
libFuncAppMixedArgs = String -> MixedCall CSharpCode
forall (r :: * -> *). ValueExpression r => String -> MixedCall r
C.libFuncAppMixedArgs

  lambda :: [VSBinder CSharpCode] -> SValue CSharpCode -> SValue CSharpCode
lambda = ([CSharpCode BinderD] -> CSharpCode Value -> Doc)
-> [VSBinder CSharpCode] -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(BinderElim r, RenderValue r, ValueSym r) =>
([r BinderD] -> r Value -> Doc)
-> [VSBinder r] -> SValue r -> SValue r
G.lambda [CSharpCode BinderD] -> CSharpCode Value -> Doc
csLambda

  notNull :: SValue CSharpCode -> SValue CSharpCode
notNull = String -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(Comparison r, VariableValue r) =>
String -> SValue r -> SValue r
CP.notNull String
nullLabel

instance OOValueExpression CSharpCode where
  newObjMixedArgs :: MixedCtorCall CSharpCode
newObjMixedArgs = MixedCall CSharpCode
forall (r :: * -> *).
(RenderValue r, UnRepr r TypeData) =>
String -> MixedCtorCall r
G.newObjMixedArgs (String
new String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" ")
  extNewObjMixedArgs :: MixedCall CSharpCode
extNewObjMixedArgs String
_ = MixedCtorCall CSharpCode
forall (r :: * -> *). OOValueExpression r => MixedCtorCall r
newObjMixedArgs
  libNewObjMixedArgs :: MixedCall CSharpCode
libNewObjMixedArgs = MixedCall CSharpCode
forall (r :: * -> *).
OOValueExpression r =>
String -> MixedCtorCall r
C.libNewObjMixedArgs

instance RenderValue CSharpCode where
  inputFunc :: SValue CSharpCode
inputFunc = SValue CSharpCode -> SValue CSharpCode
forall a. VS a -> VS a
addSystemImport SValue CSharpCode
csReadLineFunc
  printFunc :: SValue CSharpCode
printFunc = SValue CSharpCode -> SValue CSharpCode
forall a. VS a -> VS a
addSystemImport (SValue CSharpCode -> SValue CSharpCode)
-> SValue CSharpCode -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ VS (CSharpCode TypeData) -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void (String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ String
csConsole String -> String -> String
`access`
    String
csWrite)
  printLnFunc :: SValue CSharpCode
printLnFunc = SValue CSharpCode -> SValue CSharpCode
forall a. VS a -> VS a
addSystemImport (SValue CSharpCode -> SValue CSharpCode)
-> SValue CSharpCode -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ VS (CSharpCode TypeData) -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void (String -> Doc
text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ String
csConsole String -> String -> String
`access`
    String
csWriteLine)
  printFileFunc :: SValue CSharpCode -> SValue CSharpCode
printFileFunc SValue CSharpCode
w' = (CSharpCode Value -> CSharpCode TypeData -> SValue CSharpCode)
-> SValue CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\CSharpCode Value
w CSharpCode TypeData
vt ->
    CSharpCode TypeData -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal CSharpCode TypeData
vt (Doc -> SValue CSharpCode)
-> (CSharpCode Value -> Doc)
-> CSharpCode Value
-> SValue CSharpCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
csWrite (Doc -> Doc)
-> (CSharpCode Value -> Doc) -> CSharpCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value (CSharpCode Value -> SValue CSharpCode)
-> CSharpCode Value -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ CSharpCode Value
w) SValue CSharpCode
w' VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void
  printFileLnFunc :: SValue CSharpCode -> SValue CSharpCode
printFileLnFunc SValue CSharpCode
w' = (CSharpCode Value -> CSharpCode TypeData -> SValue CSharpCode)
-> SValue CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\CSharpCode Value
w CSharpCode TypeData
vt ->
    CSharpCode TypeData -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal CSharpCode TypeData
vt (Doc -> SValue CSharpCode)
-> (CSharpCode Value -> Doc)
-> CSharpCode Value
-> SValue CSharpCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
csWriteLine (Doc -> Doc)
-> (CSharpCode Value -> Doc) -> CSharpCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value (CSharpCode Value -> SValue CSharpCode)
-> CSharpCode Value -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ CSharpCode Value
w) SValue CSharpCode
w' VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void

  cast :: VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
cast = VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csCast

  call :: Maybe String -> Maybe Doc -> MixedCall CSharpCode
call = Doc -> Maybe String -> Maybe Doc -> MixedCall CSharpCode
forall (r :: * -> *).
(InternalVarElim r, RenderValue r, ValueElim r) =>
Doc -> Maybe String -> Maybe Doc -> MixedCall r
G.call Doc
csNamedArgSep

  valFromData :: Maybe Int
-> Maybe Integer
-> VS (CSharpCode TypeData)
-> Doc
-> SValue CSharpCode
valFromData Maybe Int
p Maybe Integer
i VS (CSharpCode TypeData)
t' Doc
d = do
    CSharpCode TypeData
t <- VS (CSharpCode TypeData)
t'
    CSharpCode Value -> SValue CSharpCode
forall a s. a -> State s a
toState (CSharpCode Value -> SValue CSharpCode)
-> CSharpCode Value -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ (TypeData -> Doc -> Value)
-> CSharpCode TypeData -> CSharpCode Doc -> CSharpCode Value
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues (Maybe Int -> Maybe Integer -> TypeData -> Doc -> Value
vd Maybe Int
p Maybe Integer
i) CSharpCode TypeData
t (Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ValueElim CSharpCode where
  valuePrec :: CSharpCode Value -> Maybe Int
valuePrec = Value -> Maybe Int
valPrec (Value -> Maybe Int)
-> (CSharpCode Value -> Value) -> CSharpCode Value -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Value -> Value
forall a. CSharpCode a -> a
unCSC
  valueInt :: CSharpCode Value -> Maybe Integer
valueInt = Value -> Maybe Integer
valInt (Value -> Maybe Integer)
-> (CSharpCode Value -> Value) -> CSharpCode Value -> Maybe Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Value -> Value
forall a. CSharpCode a -> a
unCSC
  value :: CSharpCode Value -> Doc
value = Value -> Doc
val (Value -> Doc)
-> (CSharpCode Value -> Value) -> CSharpCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Value -> Value
forall a. CSharpCode a -> a
unCSC

instance InternalValueExp CSharpCode where
  objMethodCallMixedArgs' :: String
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> [SValue CSharpCode]
-> NamedArgs CSharpCode
-> SValue CSharpCode
objMethodCallMixedArgs' = String
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> [SValue CSharpCode]
-> NamedArgs CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
(RenderValue r, ValueElim r) =>
String
-> VS (r TypeData)
-> SValue r
-> [SValue r]
-> NamedArgs r
-> SValue r
G.objMethodCall
  classMethodCallMixedArgs' :: String -> VS (CSharpCode TypeData) -> MixedCtorCall CSharpCode
classMethodCallMixedArgs' = String -> VS (CSharpCode TypeData) -> MixedCtorCall CSharpCode
forall (r :: * -> *).
(RenderValue r, UnRepr r TypeData) =>
String
-> VS (r TypeData)
-> VS (r TypeData)
-> [SValue r]
-> NamedArgs r
-> SValue r
CG.classMethodCall

instance FunctionSym CSharpCode where

instance OOFunctionSym CSharpCode where
  func :: String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> VS (CSharpCode FuncData)
func = String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> VS (CSharpCode FuncData)
forall (r :: * -> *).
(RenderFunction r, ValueElim r, ValueExpression r) =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
G.func
  objAccess :: SValue CSharpCode -> VS (CSharpCode FuncData) -> SValue CSharpCode
objAccess = SValue CSharpCode -> VS (CSharpCode FuncData) -> SValue CSharpCode
forall (r :: * -> *).
(FunctionElim r, RenderValue r, ValueElim r) =>
SValue r -> VS (r FuncData) -> SValue r
G.objAccess

instance GetSet CSharpCode where
  get :: SValue CSharpCode -> SVariable CSharpCode -> SValue CSharpCode
get = SValue CSharpCode -> SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(InternalGetSet r, OOFunctionSym r) =>
SValue r -> SVariable r -> SValue r
G.get
  set :: SValue CSharpCode
-> SVariable CSharpCode -> SValue CSharpCode -> SValue CSharpCode
set = SValue CSharpCode
-> SVariable CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(InternalGetSet r, OOFunctionSym r) =>
SValue r -> SVariable r -> SValue r -> SValue r
G.set

instance IndexTranslator CSharpCode where
  intToIndex :: SValue CSharpCode -> SValue CSharpCode
intToIndex = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). SValue r -> SValue r
CP.intToIndex
  indexToInt :: SValue CSharpCode -> SValue CSharpCode
indexToInt = SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). SValue r -> SValue r
CP.indexToInt

instance Reference CSharpCode where
  makeRef :: SValue CSharpCode -> SValue CSharpCode
makeRef = SValue CSharpCode -> SValue CSharpCode
forall a. a -> a
id
  maybeDeref :: SValue CSharpCode -> SValue CSharpCode
maybeDeref = SValue CSharpCode -> SValue CSharpCode
forall a. a -> a
id

instance Array CSharpCode where
  arrayElem :: SValue CSharpCode -> SValue CSharpCode -> SVariable CSharpCode
arrayElem = SValue CSharpCode -> SValue CSharpCode -> SVariable CSharpCode
forall (r :: * -> *).
(IndexTranslator r, RenderVariable r, ValueElim r) =>
SValue r -> SValue r -> SVariable r
G.arrayElem
  arrayLength :: SValue CSharpCode -> SValue CSharpCode
arrayLength SValue CSharpCode
arr = SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf (SVariable CSharpCode -> SValue CSharpCode)
-> SVariable CSharpCode -> SValue CSharpCode
forall a b. (a -> b) -> a -> b
$ SValue CSharpCode -> SVariable CSharpCode -> SVariable CSharpCode
forall (r :: * -> *).
OOVariableSym r =>
SValue r -> SVariable r -> SVariable r
instanceVarAccess SValue CSharpCode
arr (String -> VS (CSharpCode TypeData) -> SVariable CSharpCode
forall (r :: * -> *).
VariableSym r =>
String -> VS (r TypeData) -> SVariable r
var String
"Length" VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
int)
  arrayCopy :: SValue CSharpCode -> SValue CSharpCode
arrayCopy SValue CSharpCode
arr = let
    arrTp :: VS (CSharpCode TypeData)
arrTp = (CSharpCode Value -> CSharpCode TypeData)
-> SValue CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Value -> CSharpCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType SValue CSharpCode
arr
    in VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> SValue r -> SValue r
cast VS (CSharpCode TypeData)
arrTp (VS (CSharpCode TypeData)
-> SValue CSharpCode
-> String
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *).
InternalValueExp r =>
VS (r TypeData) -> SValue r -> String -> [SValue r] -> SValue r
objMethodCall VS (CSharpCode TypeData)
arrTp SValue CSharpCode
arr String
"Clone" [])

instance List CSharpCode (Doc, Terminator) where
  listSize :: SValue CSharpCode -> SValue CSharpCode
listSize = String -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(OOVariableSym r, VariableValue r) =>
String -> SValue r -> SValue r
C.listSize' String
csListSize
  listAdd :: SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
listAdd = String
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(IndexTranslator r, InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> SValue r -> SValue r -> MS (r smt)
CG.listAdd String
csListAdd
  listAppend :: SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
listAppend = String
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> SValue r -> MS (r smt)
CG.listAppend String
csListAppend
  listAccess :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
listAccess = SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(IndexTranslator r, InternalListFunc r, FunctionElim r,
 RenderFunction r, RenderValue r, TypeElim r, ValueElim r) =>
SValue r -> SValue r -> SValue r
G.listAccess
  listSet :: SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
listSet = SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, IndexTranslator r, RenderVariable r,
 ValueElim r) =>
SValue r -> SValue r -> SValue r -> MS (r smt)
CP.listSet
  indexOf :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
indexOf = String
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
(IndexTranslator r, OOFunctionSym r) =>
String -> SValue r -> SValue r -> SValue r
CP.indexOf String
csIndex

instance Set CSharpCode where
  contains :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
contains = String
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
OOFunctionSym r =>
String -> SValue r -> SValue r -> SValue r
CP.contains String
csContains
  setAdd :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
setAdd = String
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
csListAppend
  setRemove :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
setRemove = String
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
csListRemove
  setUnion :: SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
setUnion = String
-> SValue CSharpCode -> SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *).
InternalValueExp r =>
String -> SValue r -> SValue r -> SValue r
CP.setMethodCall String
csUnionWith

instance InternalList CSharpCode where
  listSlice' :: Maybe (SValue CSharpCode)
-> Maybe (SValue CSharpCode)
-> Maybe (SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
listSlice' = Maybe (SValue CSharpCode)
-> Maybe (SValue CSharpCode)
-> Maybe (SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
forall (r :: * -> *) smt.
(SharedStatement r smt, ValueElim r, VariableElim r) =>
Maybe (SValue r)
-> Maybe (SValue r)
-> Maybe (SValue r)
-> SVariable r
-> SValue r
-> MS (r Doc)
M.listSlice

instance InternalGetSet CSharpCode where
  getFunc :: SVariable CSharpCode -> VS (CSharpCode FuncData)
getFunc = SVariable CSharpCode -> VS (CSharpCode FuncData)
forall (r :: * -> *).
(OOFunctionSym r, VariableElim r) =>
SVariable r -> VS (r FuncData)
G.getFunc
  setFunc :: VS (CSharpCode TypeData)
-> SVariable CSharpCode
-> SValue CSharpCode
-> VS (CSharpCode FuncData)
setFunc = VS (CSharpCode TypeData)
-> SVariable CSharpCode
-> SValue CSharpCode
-> VS (CSharpCode FuncData)
forall (r :: * -> *).
(OOFunctionSym r, VariableElim r) =>
VS (r TypeData) -> SVariable r -> SValue r -> VS (r FuncData)
G.setFunc

instance InternalListFunc CSharpCode where
  listAccessFunc :: VS (CSharpCode TypeData)
-> SValue CSharpCode -> VS (CSharpCode FuncData)
listAccessFunc = VS (CSharpCode TypeData)
-> SValue CSharpCode -> VS (CSharpCode FuncData)
forall (r :: * -> *).
(RenderFunction r, TypeElim r, ValueElim r, ValueSym r) =>
VS (r TypeData) -> SValue r -> VS (r FuncData)
CS.listAccessFunc

instance BinderSym CSharpCode where
  binder :: String -> VS (CSharpCode TypeData) -> VSBinder CSharpCode
binder String
nm VS (CSharpCode TypeData)
tp = (TypeData -> BinderD) -> CSharpCode TypeData -> CSharpCode BinderD
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (String -> TypeData -> BinderD
bindFormD String
nm) (CSharpCode TypeData -> CSharpCode BinderD)
-> VS (CSharpCode TypeData) -> VSBinder CSharpCode
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
<$> VS (CSharpCode TypeData)
tp

instance BinderElim CSharpCode where
  binderName :: CSharpCode BinderD -> String
binderName = BinderD -> String
bindName (BinderD -> String)
-> (CSharpCode BinderD -> BinderD) -> CSharpCode BinderD -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode BinderD -> BinderD
forall a. CSharpCode a -> a
unCSC
  binderType :: CSharpCode BinderD -> CSharpCode TypeData
binderType = (BinderD -> TypeData) -> CSharpCode BinderD -> CSharpCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue BinderD -> TypeData
bindType

instance InternalBinderElim CSharpCode where
  binderElim :: CSharpCode BinderD -> Doc
binderElim = String -> Doc
text (String -> Doc)
-> (CSharpCode BinderD -> String) -> CSharpCode BinderD -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BinderD -> String
bindName (BinderD -> String)
-> (CSharpCode BinderD -> BinderD) -> CSharpCode BinderD -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode BinderD -> BinderD
forall a. CSharpCode a -> a
unCSC

instance RenderFunction CSharpCode where
  funcFromData :: Doc -> VS (CSharpCode TypeData) -> VS (CSharpCode FuncData)
funcFromData Doc
d = (CSharpCode TypeData -> CSharpCode FuncData)
-> VS (CSharpCode TypeData) -> VS (CSharpCode FuncData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((TypeData -> FuncData)
-> CSharpCode TypeData -> CSharpCode FuncData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (TypeData -> Doc -> FuncData
`fd` Doc
d))

instance FunctionElim CSharpCode where
  functionType :: CSharpCode FuncData -> CSharpCode TypeData
functionType = (FuncData -> TypeData)
-> CSharpCode FuncData -> CSharpCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue FuncData -> TypeData
fType
  function :: CSharpCode FuncData -> Doc
function = FuncData -> Doc
funcDoc (FuncData -> Doc)
-> (CSharpCode FuncData -> FuncData) -> CSharpCode FuncData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode FuncData -> FuncData
forall a. CSharpCode a -> a
unCSC

instance InternalAssignStmt CSharpCode (Doc, Terminator) where
  multiAssign :: [SVariable CSharpCode]
-> [SValue CSharpCode] -> MS (CSharpCode (Doc, Terminator))
multiAssign [SVariable CSharpCode]
_ [SValue CSharpCode]
_ = String -> MS (CSharpCode (Doc, Terminator))
forall a. HasCallStack => String -> a
error (String -> MS (CSharpCode (Doc, Terminator)))
-> String -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiAssignError String
csName

instance InternalIOStmt CSharpCode (Doc, Terminator) where
  printSt :: Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
printSt Bool
_ Maybe (SValue CSharpCode)
_ = SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
SValue r -> SValue r -> MS (r smt)
CP.printSt

instance InternalControlStmt CSharpCode (Doc, Terminator) where
  multiReturn :: [SValue CSharpCode] -> MS (CSharpCode (Doc, Terminator))
multiReturn [SValue CSharpCode]
_ = String -> MS (CSharpCode (Doc, Terminator))
forall a. HasCallStack => String -> a
error (String -> MS (CSharpCode (Doc, Terminator)))
-> String -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiReturnError String
csName

instance RenderStatement CSharpCode (Doc, Terminator) where
  stmt :: MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
stmt = MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, StatementElim r smt) =>
MS (r smt) -> MS (r smt)
G.stmt
  loopStmt :: MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
loopStmt = MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, StatementElim r smt) =>
MS (r smt) -> MS (r smt)
G.loopStmt
  stmtFromData :: Doc -> Terminator -> MS (CSharpCode (Doc, Terminator))
stmtFromData Doc
d Terminator
t = CSharpCode (Doc, Terminator) -> MS (CSharpCode (Doc, Terminator))
forall a s. a -> State s a
toState (CSharpCode (Doc, Terminator) -> MS (CSharpCode (Doc, Terminator)))
-> CSharpCode (Doc, Terminator)
-> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ (Doc, Terminator) -> CSharpCode (Doc, Terminator)
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc
d, Terminator
t)

instance StatementElim CSharpCode (Doc, Terminator) where
  statement :: CSharpCode (Doc, Terminator) -> Doc
statement = (Doc, Terminator) -> Doc
forall a b. (a, b) -> a
fst ((Doc, Terminator) -> Doc)
-> (CSharpCode (Doc, Terminator) -> (Doc, Terminator))
-> CSharpCode (Doc, Terminator)
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode (Doc, Terminator) -> (Doc, Terminator)
forall a. CSharpCode a -> a
unCSC
  statementTerm :: CSharpCode (Doc, Terminator) -> Terminator
statementTerm = (Doc, Terminator) -> Terminator
forall a b. (a, b) -> b
snd ((Doc, Terminator) -> Terminator)
-> (CSharpCode (Doc, Terminator) -> (Doc, Terminator))
-> CSharpCode (Doc, Terminator)
-> Terminator
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode (Doc, Terminator) -> (Doc, Terminator)
forall a. CSharpCode a -> a
unCSC

instance StatementSym CSharpCode (Doc, Terminator) where
  valStmt :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
valStmt = Terminator
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
Terminator -> SValue r -> MS (r smt)
G.valStmt Terminator
Semi
  emptyStmt :: MS (CSharpCode (Doc, Terminator))
emptyStmt = MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt. RenderStatement r smt => MS (r smt)
G.emptyStmt
  multi :: [MS (CSharpCode (Doc, Terminator))]
-> MS (CSharpCode (Doc, Terminator))
multi = ([CSharpCode (Doc, Terminator)] -> CSharpCode (Doc, Terminator))
-> [MS (CSharpCode (Doc, Terminator))]
-> MS (CSharpCode (Doc, Terminator))
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([(Doc, Terminator)] -> (Doc, Terminator))
-> [CSharpCode (Doc, Terminator)] -> CSharpCode (Doc, Terminator)
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [(Doc, Terminator)] -> (Doc, Terminator)
R.multiStmt)

instance AssignStatement CSharpCode (Doc, Terminator) where
  assign :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
assign = Terminator
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
Terminator -> SVariable r -> SValue r -> MS (r smt)
G.assign Terminator
Semi
  &-= :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
(&-=) = Terminator
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
Terminator -> SVariable r -> SValue r -> MS (r smt)
G.subAssign Terminator
Semi
  &+= :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
(&+=) = SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ValueElim r) =>
SVariable r -> SValue r -> MS (r smt)
C.increment
  &++ :: SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
(&++) = SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt) =>
SVariable r -> MS (r smt)
C.increment1
  &-- :: SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
(&--) = SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt) =>
SVariable r -> MS (r smt)
C.decrement1

instance DeclStatement CSharpCode (Doc, Terminator) where
  varDec :: SVariable CSharpCode
-> CSharpCode ScopeData -> MS (CSharpCode (Doc, Terminator))
varDec SVariable CSharpCode
v CSharpCode ScopeData
scp = LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Variable))
  MethodState
  ValueState
-> SVariable CSharpCode
-> StateT MethodState Identity (CSharpCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Variable) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable CSharpCode
v StateT MethodState Identity (CSharpCode Variable)
-> (CSharpCode Variable -> MS (CSharpCode (Doc, Terminator)))
-> MS (CSharpCode (Doc, Terminator))
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\CSharpCode Variable
v' -> AttachmentTag
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
forall smt.
AttachmentTag -> MS (CSharpCode smt) -> MS (CSharpCode smt)
csVarDec (CSharpCode Variable -> AttachmentTag
forall (r :: * -> *).
InternalVarElim r =>
r Variable -> AttachmentTag
variableBind CSharpCode Variable
v') (MS (CSharpCode (Doc, Terminator))
 -> MS (CSharpCode (Doc, Terminator)))
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$
    CSharpCode Doc
-> CSharpCode Doc
-> Doc
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) att smt.
(InternalVarElim r, PermElim r att, RenderStatement r smt,
 ScopeElim r, UnRepr r TypeData, TypeElim r, VariableElim r) =>
r att -> r att -> Doc -> SVariable r -> r ScopeData -> MS (r smt)
C.varDec CSharpCode Doc
forall (r :: * -> *) att. AttachmentSym r att => r att
classLevel CSharpCode Doc
forall (r :: * -> *) att. AttachmentSym r att => r att
instanceLevel Doc
empty SVariable CSharpCode
v CSharpCode ScopeData
scp)
  varDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
varDecDef = Terminator
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
Terminator -> SVariable r -> r ScopeData -> SValue r -> MS (r smt)
C.varDecDef Terminator
Semi
  setDec :: SVariable CSharpCode
-> CSharpCode ScopeData -> MS (CSharpCode (Doc, Terminator))
setDec = SVariable CSharpCode
-> CSharpCode ScopeData -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> MS (r smt)
varDec
  setDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
setDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
varDecDef
  listDec :: Integer
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> MS (CSharpCode (Doc, Terminator))
listDec Integer
n SVariable CSharpCode
v CSharpCode ScopeData
scp = LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Variable))
  MethodState
  ValueState
-> SVariable CSharpCode
-> StateT MethodState Identity (CSharpCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Variable) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable CSharpCode
v StateT MethodState Identity (CSharpCode Variable)
-> (CSharpCode Variable -> MS (CSharpCode (Doc, Terminator)))
-> MS (CSharpCode (Doc, Terminator))
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\CSharpCode Variable
v' -> (CSharpCode Value -> Doc)
-> SValue CSharpCode
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt,
 StatementElim r smt) =>
(r Value -> Doc)
-> SValue r -> SVariable r -> r ScopeData -> MS (r smt)
C.listDec (CSharpCode Variable -> CSharpCode Value -> Doc
forall (r :: * -> *).
(UnRepr r TypeData, ValueElim r, VariableElim r) =>
r Variable -> r Value -> Doc
renderListDec CSharpCode Variable
v')
    (Integer -> SValue CSharpCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n) SVariable CSharpCode
v CSharpCode ScopeData
scp)
  listDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
listDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, Literal r, VariableElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
CP.listDecDef
  arrayDec :: Integer
-> SValue CSharpCode
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> MS (CSharpCode (Doc, Terminator))
arrayDec Integer
n SValue CSharpCode
_ = SValue CSharpCode
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(ScopeElim r, UnRepr r TypeData, InternalVarElim r,
 RenderStatement r smt, ValueElim r, VariableElim r) =>
SValue r -> SVariable r -> r ScopeData -> MS (r smt)
CP.arrayDec (Integer -> SValue CSharpCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt Integer
n)
  arrayDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
arrayDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
CP.arrayDecDef
  constDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
constDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalVarElim r, RenderStatement r smt, ScopeElim r,
 UnRepr r TypeData, ValueElim r, VariableElim r) =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
CG.constDecDef
  funcDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
funcDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
csFuncDecDef

instance OODeclStatement CSharpCode (Doc, Terminator) where
  objDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
objDecDef = SVariable CSharpCode
-> CSharpCode ScopeData
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> SValue r -> MS (r smt)
varDecDef
  objDecNew :: SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
objDecNew = SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, OOValueExpression r, VariableElim r) =>
SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
G.objDecNew
  extObjDecNew :: String
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
extObjDecNew = String
-> SVariable CSharpCode
-> CSharpCode ScopeData
-> [SValue CSharpCode]
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(DeclStatement r smt, OOValueExpression r, VariableElim r) =>
String -> SVariable r -> r ScopeData -> [SValue r] -> MS (r smt)
C.extObjDecNew

instance IOStatement CSharpCode (Doc, Terminator) where
  print :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
print      = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
False Maybe (SValue CSharpCode)
forall a. Maybe a
Nothing SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc
  printLn :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
printLn    = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
True  Maybe (SValue CSharpCode)
forall a. Maybe a
Nothing SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc
  printStr :: String -> MS (CSharpCode (Doc, Terminator))
printStr   = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
False Maybe (SValue CSharpCode)
forall a. Maybe a
Nothing SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc   (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> (String -> SValue CSharpCode)
-> String
-> MS (CSharpCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue CSharpCode
forall (r :: * -> *). Literal r => String -> SValue r
litString
  printStrLn :: String -> MS (CSharpCode (Doc, Terminator))
printStrLn = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
True  Maybe (SValue CSharpCode)
forall a. Maybe a
Nothing SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> (String -> SValue CSharpCode)
-> String
-> MS (CSharpCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue CSharpCode
forall (r :: * -> *). Literal r => String -> SValue r
litString

  printFile :: SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
printFile SValue CSharpCode
f      = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
False (SValue CSharpCode -> Maybe (SValue CSharpCode)
forall a. a -> Maybe a
Just SValue CSharpCode
f) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileFunc SValue CSharpCode
f)
  printFileLn :: SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
printFileLn SValue CSharpCode
f    = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
True  (SValue CSharpCode -> Maybe (SValue CSharpCode)
forall a. a -> Maybe a
Just SValue CSharpCode
f) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileLnFunc SValue CSharpCode
f)
  printFileStr :: SValue CSharpCode -> String -> MS (CSharpCode (Doc, Terminator))
printFileStr SValue CSharpCode
f   = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
False (SValue CSharpCode -> Maybe (SValue CSharpCode)
forall a. a -> Maybe a
Just SValue CSharpCode
f) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileFunc SValue CSharpCode
f)   (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> (String -> SValue CSharpCode)
-> String
-> MS (CSharpCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue CSharpCode
forall (r :: * -> *). Literal r => String -> SValue r
litString
  printFileStrLn :: SValue CSharpCode -> String -> MS (CSharpCode (Doc, Terminator))
printFileStrLn SValue CSharpCode
f = Bool
-> Maybe (SValue CSharpCode)
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
True  (SValue CSharpCode -> Maybe (SValue CSharpCode)
forall a. a -> Maybe a
Just SValue CSharpCode
f) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r -> SValue r
printFileLnFunc SValue CSharpCode
f) (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> (String -> SValue CSharpCode)
-> String
-> MS (CSharpCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> SValue CSharpCode
forall (r :: * -> *). Literal r => String -> SValue r
litString

  getInput :: SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
getInput SVariable CSharpCode
v = SVariable CSharpCode
v SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csInput ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
v) SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
inputFunc
  discardInput :: MS (CSharpCode (Doc, Terminator))
discardInput = SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
csDiscardInput SValue CSharpCode
forall (r :: * -> *). RenderValue r => SValue r
inputFunc
  getFileInput :: SValue CSharpCode
-> SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
getFileInput SValue CSharpCode
f SVariable CSharpCode
v = SVariable CSharpCode
v SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
&= VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csInput ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
v) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). InternalValueExp r => SValue r -> SValue r
csFileInput SValue CSharpCode
f)
  discardFileInput :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
discardFileInput SValue CSharpCode
f = SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). InternalValueExp r => SValue r -> SValue r
csFileInput SValue CSharpCode
f

  openFileR :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
openFileR = (SValue CSharpCode
 -> VS (CSharpCode TypeData) -> SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
(SValue r -> VS (r TypeData) -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileR SValue CSharpCode -> VS (CSharpCode TypeData) -> SValue CSharpCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r
csOpenFileR
  openFileW :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
openFileW = (SValue CSharpCode
 -> VS (CSharpCode TypeData)
 -> SValue CSharpCode
 -> SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, Literal r) =>
(SValue r -> VS (r TypeData) -> SValue r -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileW SValue CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
csOpenFileWorA
  openFileA :: SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
openFileA = (SValue CSharpCode
 -> VS (CSharpCode TypeData)
 -> SValue CSharpCode
 -> SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, Literal r) =>
(SValue r -> VS (r TypeData) -> SValue r -> SValue r)
-> SVariable r -> SValue r -> MS (r smt)
CP.openFileA SValue CSharpCode
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
csOpenFileWorA
  closeFile :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
closeFile = String -> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> MS (r smt)
G.closeFile String
csClose

  getFileInputLine :: SValue CSharpCode
-> SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
getFileInputLine = SValue CSharpCode
-> SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
IOStatement r smt =>
SValue r -> SVariable r -> MS (r smt)
getFileInput
  discardFileLine :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
discardFileLine = String -> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(InternalValueExp r, StatementSym r smt) =>
String -> SValue r -> MS (r smt)
CP.discardFileLine String
csReadLine
  getFileInputAll :: SValue CSharpCode
-> SVariable CSharpCode -> MS (CSharpCode (Doc, Terminator))
getFileInputAll SValue CSharpCode
f SVariable CSharpCode
v = SValue CSharpCode
-> MS (CSharpCode Doc) -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r Doc) -> MS (r smt)
while ((SValue CSharpCode
f SValue CSharpCode -> VS (CSharpCode FuncData) -> SValue CSharpCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. Doc -> VS (CSharpCode TypeData) -> VS (CSharpCode FuncData)
forall (r :: * -> *).
RenderFunction r =>
Doc -> VS (r TypeData) -> VS (r FuncData)
funcFromData (Doc
dot Doc -> Doc -> Doc
<> String -> Doc
text String
csEOS) VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool) ?!)
    (MS (CSharpCode (Doc, Terminator)) -> MS (CSharpCode Doc)
forall (r :: * -> *) smt. BodySym r smt => MS (r smt) -> MS (r Doc)
oneLiner (MS (CSharpCode (Doc, Terminator)) -> MS (CSharpCode Doc))
-> MS (CSharpCode (Doc, Terminator)) -> MS (CSharpCode Doc)
forall a b. (a -> b) -> a -> b
$ SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
List r smt =>
SValue r -> SValue r -> MS (r smt)
listAppend (SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable CSharpCode
v) (SValue CSharpCode -> SValue CSharpCode
forall (r :: * -> *). InternalValueExp r => SValue r -> SValue r
csFileInput SValue CSharpCode
f))

instance StringStatement CSharpCode (Doc, Terminator) where
  stringSplit :: Char
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
stringSplit Char
d SVariable CSharpCode
vnew SValue CSharpCode
s = SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable CSharpCode
vnew (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ VS (CSharpCode TypeData)
-> [SValue CSharpCode] -> SValue CSharpCode
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string)
    [SValue CSharpCode
s SValue CSharpCode -> VS (CSharpCode FuncData) -> SValue CSharpCode
forall (r :: * -> *).
OOFunctionSym r =>
SValue r -> VS (r FuncData) -> SValue r
$. Char -> VS (CSharpCode FuncData)
csSplitFunc Char
d]

  stringListVals :: [SVariable CSharpCode]
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
stringListVals = [SVariable CSharpCode]
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(AssignStatement r smt, List r smt, Literal r, RenderValue r,
 TypeElim r, VariableElim r) =>
[SVariable r] -> SValue r -> MS (r smt)
M.stringListVals
  stringListLists :: [SVariable CSharpCode]
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
stringListLists = [SVariable CSharpCode]
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderValue r, SharedStatement r smt, TypeElim r,
 VariableElim r) =>
[SVariable r] -> SValue r -> MS (r smt)
M.stringListLists

instance FuncAppStatement CSharpCode (Doc, Terminator) where
  inOutCall :: InOutCall CSharpCode (Doc, Terminator)
inOutCall = (String
 -> VS (CSharpCode TypeData)
 -> [SValue CSharpCode]
 -> SValue CSharpCode)
-> InOutCall CSharpCode (Doc, Terminator)
csInOutCall String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp
  extInOutCall :: String -> InOutCall CSharpCode (Doc, Terminator)
extInOutCall String
m = (String
 -> VS (CSharpCode TypeData)
 -> [SValue CSharpCode]
 -> SValue CSharpCode)
-> InOutCall CSharpCode (Doc, Terminator)
csInOutCall (String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
m)

instance OOFuncAppStatement CSharpCode (Doc, Terminator) where
  selfInOutCall :: InOutCall CSharpCode (Doc, Terminator)
selfInOutCall = (String
 -> VS (CSharpCode TypeData)
 -> [SValue CSharpCode]
 -> SValue CSharpCode)
-> InOutCall CSharpCode (Doc, Terminator)
csInOutCall String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *).
(InternalValueExp r, VariableValue r, SelfSym r) =>
PosCall r
selfMethodCall

instance CommentStatement CSharpCode (Doc, Terminator) where
  comment :: String -> MS (CSharpCode (Doc, Terminator))
comment = Doc -> String -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> String -> MS (r smt)
G.comment Doc
commentStart

instance ControlStatement CSharpCode (Doc, Terminator) where
  break :: MS (CSharpCode (Doc, Terminator))
break =  Doc -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt Doc
R.break
  continue :: MS (CSharpCode (Doc, Terminator))
continue =  Doc -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt Doc
R.continue

  returnStmt :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
returnStmt = Terminator
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(RenderStatement r smt, ValueElim r) =>
Terminator -> SValue r -> MS (r smt)
G.returnStmt Terminator
Semi

  throw :: String -> MS (CSharpCode (Doc, Terminator))
throw String
msg = do
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> MethodState -> MethodState
addLangImport String
csSystem)
    (CSharpCode Value -> Doc)
-> Terminator -> String -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(Literal r, RenderStatement r smt) =>
(r Value -> Doc) -> Terminator -> String -> MS (r smt)
G.throw CSharpCode Value -> Doc
csThrowDoc Terminator
Semi String
msg

  ifCond :: [(SValue CSharpCode, MS (CSharpCode Doc))]
-> MS (CSharpCode Doc) -> MS (CSharpCode (Doc, Terminator))
ifCond = (Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue CSharpCode, MS (CSharpCode Doc))]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, ValueElim r) =>
(Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue r, MS (r Doc))]
-> MS (r Doc)
-> MS (r smt)
G.ifCond Doc -> Doc
parens Doc
bodyStart OptionalSpace
G.defaultOptSpace Doc
elseIfLabel Doc
bodyEnd Doc
empty
  switch :: SValue CSharpCode
-> [(SValue CSharpCode, MS (CSharpCode Doc))]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
switch = (Doc -> Doc)
-> MS (CSharpCode (Doc, Terminator))
-> SValue CSharpCode
-> [(SValue CSharpCode, MS (CSharpCode Doc))]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
(Doc -> Doc)
-> MS (r smt)
-> SValue r
-> [(SValue r, MS (r Doc))]
-> MS (r Doc)
-> MS (r smt)
C.switch Doc -> Doc
parens MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt. ControlStatement r smt => MS (r smt)
break

  ifExists :: SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
ifExists = SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(ControlStatement r smt, ValueExpression r) =>
SValue r -> MS (r Doc) -> MS (r Doc) -> MS (r smt)
M.ifExists

  for :: MS (CSharpCode (Doc, Terminator))
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
for = Doc
-> Doc
-> MS (CSharpCode (Doc, Terminator))
-> SValue CSharpCode
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, StatementElim r smt,
 ValueElim r) =>
Doc
-> Doc
-> MS (r smt)
-> SValue r
-> MS (r smt)
-> MS (r Doc)
-> MS (r smt)
C.for Doc
bodyStart Doc
bodyEnd
  forRange :: SVariable CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forRange = SVariable CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
SharedStatement r smt =>
SVariable r
-> SValue r -> SValue r -> SValue r -> MS (r Doc) -> MS (r smt)
M.forRange
  forEach :: SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forEach = Doc
-> Doc
-> Doc
-> Doc
-> SVariable CSharpCode
-> SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, InternalVarElim r, RenderStatement r smt,
 UnRepr r TypeData, ValueElim r, VariableElim r) =>
Doc
-> Doc
-> Doc
-> Doc
-> SVariable r
-> SValue r
-> MS (r Doc)
-> MS (r smt)
CP.forEach Doc
bodyStart Doc
bodyEnd Doc
csForEach Doc
inLabel
  while :: SValue CSharpCode
-> MS (CSharpCode Doc) -> MS (CSharpCode (Doc, Terminator))
while = (Doc -> Doc)
-> Doc
-> Doc
-> SValue CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
(BodyElim r, RenderStatement r smt, ValueElim r) =>
(Doc -> Doc) -> Doc -> Doc -> SValue r -> MS (r Doc) -> MS (r smt)
C.while Doc -> Doc
parens Doc
bodyStart Doc
bodyEnd

  tryCatch :: MS (CSharpCode Doc)
-> MS (CSharpCode Doc) -> MS (CSharpCode (Doc, Terminator))
tryCatch = (CSharpCode Doc -> CSharpCode Doc -> Doc)
-> MS (CSharpCode Doc)
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
(r Doc -> r Doc -> Doc) -> MS (r Doc) -> MS (r Doc) -> MS (r smt)
G.tryCatch CSharpCode Doc -> CSharpCode Doc -> Doc
csTryCatch

  assert :: SValue CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
assert SValue CSharpCode
condition SValue CSharpCode
errorMessage = do
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> MethodState -> MethodState
addLangImport String
csDiagnostics)
    CSharpCode Value
cond <- LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Value))
  MethodState
  ValueState
-> SValue CSharpCode
-> StateT MethodState Identity (CSharpCode Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Value) ValueState)
-> MethodState -> Focusing Identity (CSharpCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue CSharpCode
condition
    CSharpCode Value
errMsg <- LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Value))
  MethodState
  ValueState
-> SValue CSharpCode
-> StateT MethodState Identity (CSharpCode Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Value) ValueState)
-> MethodState -> Focusing Identity (CSharpCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue CSharpCode
errorMessage
    Doc -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmtNoEnd (CSharpCode Value -> CSharpCode Value -> Doc
csAssert CSharpCode Value
cond CSharpCode Value
errMsg)

instance ObserverPattern CSharpCode (Doc, Terminator) where
  notifyObservers :: VS (CSharpCode FuncData)
-> VS (CSharpCode TypeData) -> MS (CSharpCode (Doc, Terminator))
notifyObservers = VS (CSharpCode FuncData)
-> VS (CSharpCode TypeData) -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
OOStatement r smt =>
VS (r FuncData) -> VS (r TypeData) -> MS (r smt)
M.notifyObservers

instance StrategyPattern CSharpCode (Doc, Terminator) where
  runStrategy :: String
-> [(String, MS (CSharpCode Doc))]
-> Maybe (SValue CSharpCode)
-> Maybe (SVariable CSharpCode)
-> MS (CSharpCode Doc)
runStrategy = String
-> [(String, MS (CSharpCode Doc))]
-> Maybe (SValue CSharpCode)
-> Maybe (SVariable CSharpCode)
-> MS (CSharpCode Doc)
forall (r :: * -> *) smt.
(AssignStatement r smt, BodyElim r, Monad r, RenderStatement r smt,
 StatementElim r smt) =>
String
-> [(String, MS (r Doc))]
-> Maybe (SValue r)
-> Maybe (SVariable r)
-> MS (r Doc)
M.runStrategy

instance VisibilitySym CSharpCode Doc where
  private :: CSharpCode Doc
private = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.private
  public :: CSharpCode Doc
public = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
R.public

instance RenderVisibility CSharpCode Doc where
  visibilityFromData :: VisibilityTag -> Doc -> CSharpCode Doc
visibilityFromData VisibilityTag
_ = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode

instance VisibilityElim CSharpCode Doc where
  visibility :: CSharpCode Doc -> Doc
visibility = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

instance MethodTypeSym CSharpCode where
  mType :: VS (CSharpCode TypeData) -> MSMthdType CSharpCode
mType = LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode TypeData))
  MethodState
  ValueState
-> VS (CSharpCode TypeData) -> MSMthdType CSharpCode
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode TypeData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode TypeData) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode TypeData) MethodState
Lens' MethodState ValueState
lensMStoVS

instance OOMethodTypeSym CSharpCode where
  construct :: String -> MSMthdType CSharpCode
construct = String -> MSMthdType CSharpCode
forall (r :: * -> *). Monad r => String -> MS (r TypeData)
G.construct

instance ParameterSym CSharpCode where
  param :: SVariable CSharpCode -> MS (CSharpCode ParamData)
param = (CSharpCode Variable -> Doc)
-> SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
(RenderParam r, VariableElim r) =>
(r Variable -> Doc) -> SVariable r -> MS (r ParamData)
G.param CSharpCode Variable -> Doc
forall (r :: * -> *).
(InternalVarElim r, UnRepr r TypeData, VariableElim r) =>
r Variable -> Doc
renderParam
  pointerParam :: SVariable CSharpCode -> MS (CSharpCode ParamData)
pointerParam = SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param

instance RenderParam CSharpCode where
  paramFromData :: SVariable CSharpCode -> Doc -> MS (CSharpCode ParamData)
paramFromData SVariable CSharpCode
v' Doc
d = do
    CSharpCode Variable
v <- LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Variable))
  MethodState
  ValueState
-> SVariable CSharpCode
-> StateT MethodState Identity (CSharpCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Variable) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable CSharpCode
v'
    CSharpCode ParamData -> MS (CSharpCode ParamData)
forall a s. a -> State s a
toState (CSharpCode ParamData -> MS (CSharpCode ParamData))
-> CSharpCode ParamData -> MS (CSharpCode ParamData)
forall a b. (a -> b) -> a -> b
$ (Variable -> Doc -> ParamData)
-> CSharpCode Variable -> CSharpCode Doc -> CSharpCode ParamData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues Variable -> Doc -> ParamData
pd CSharpCode Variable
v (Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

instance ParamElim CSharpCode where
  parameterName :: CSharpCode ParamData -> String
parameterName = CSharpCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName (CSharpCode Variable -> String)
-> (CSharpCode ParamData -> CSharpCode Variable)
-> CSharpCode ParamData
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable)
-> CSharpCode ParamData -> CSharpCode Variable
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> Variable
paramVar
  parameterType :: CSharpCode ParamData -> CSharpCode TypeData
parameterType = CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType (CSharpCode Variable -> CSharpCode TypeData)
-> (CSharpCode ParamData -> CSharpCode Variable)
-> CSharpCode ParamData
-> CSharpCode TypeData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable)
-> CSharpCode ParamData -> CSharpCode Variable
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> Variable
paramVar
  parameter :: CSharpCode ParamData -> Doc
parameter = ParamData -> Doc
paramDoc (ParamData -> Doc)
-> (CSharpCode ParamData -> ParamData)
-> CSharpCode ParamData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode ParamData -> ParamData
forall a. CSharpCode a -> a
unCSC

instance MethodSym CSharpCode Doc (Doc, Terminator) MethodData where
  docMain :: MS (CSharpCode Doc) -> MS (CSharpCode MethodData)
docMain = MS (CSharpCode Doc) -> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
MS (r Doc) -> MS (r md)
CP.docMain
  function :: String
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
function = String
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) att vis md.
(AttachmentSym r att, OORenderMethod r vis md att) =>
String
-> r vis
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
G.function
  mainFunction :: MS (CSharpCode Doc) -> MS (CSharpCode MethodData)
mainFunction = VS (CSharpCode TypeData)
-> String -> MS (CSharpCode Doc) -> MS (CSharpCode MethodData)
forall (r :: * -> *) att vis md.
(AttachmentSym r att, OORenderMethod r vis md att, ParameterSym r,
 UnRepr r TypeData, Monad r, VisibilitySym r vis) =>
VS (r TypeData) -> String -> MS (r Doc) -> MS (r md)
CP.mainFunction VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string String
csMain
  docFunc :: String
-> [String]
-> Maybe String
-> MS (CSharpCode MethodData)
-> MS (CSharpCode MethodData)
docFunc = String
-> [String]
-> Maybe String
-> MS (CSharpCode MethodData)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) md.
RenderMethod r md =>
String -> [String] -> Maybe String -> MS (r md) -> MS (r md)
CP.doxFunc

  inOutFunc :: String -> CSharpCode Doc -> InOutFunc CSharpCode MethodData
inOutFunc String
n CSharpCode Doc
s = (VS (CSharpCode TypeData)
 -> [MS (CSharpCode ParamData)]
 -> MS (CSharpCode Doc)
 -> MS (CSharpCode MethodData))
-> InOutFunc CSharpCode MethodData
forall md.
(VS (CSharpCode TypeData)
 -> [MS (CSharpCode ParamData)]
 -> MS (CSharpCode Doc)
 -> MS (CSharpCode md))
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
csInOut (String
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md.
MethodSym r vis smt md =>
String
-> r vis
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
function String
n CSharpCode Doc
s)
  docInOutFunc :: String -> CSharpCode Doc -> DocInOutFunc CSharpCode MethodData
docInOutFunc String
n CSharpCode Doc
s = InOutFunc CSharpCode MethodData
-> DocInOutFunc CSharpCode MethodData
forall (r :: * -> *) md.
RenderMethod r md =>
([SVariable r]
 -> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md))
-> String
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> MS (r Doc)
-> MS (r md)
CP.docInOutFunc (String -> CSharpCode Doc -> InOutFunc CSharpCode MethodData
forall (r :: * -> *) vis smt md.
MethodSym r vis smt md =>
String -> r vis -> InOutFunc r md
inOutFunc String
n CSharpCode Doc
s)

instance OOMethodSym CSharpCode Doc (Doc, Terminator) MethodData Doc where
  method :: String
-> CSharpCode Doc
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
method = String
-> CSharpCode Doc
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) vis md att.
OORenderMethod r vis md att =>
String
-> r vis
-> r att
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
G.method
  getMethod :: SVariable CSharpCode -> MS (CSharpCode MethodData)
getMethod = SVariable CSharpCode -> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
SVariable r -> MS (r md)
G.getMethod
  setMethod :: SVariable CSharpCode -> MS (CSharpCode MethodData)
setMethod = SVariable CSharpCode -> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md svr att.
OORenderSym r vis smt md svr att =>
SVariable r -> MS (r md)
G.setMethod
  constructor :: [MS (CSharpCode ParamData)]
-> NamedArgs CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
constructor [MS (CSharpCode ParamData)]
ps NamedArgs CSharpCode
is MS (CSharpCode Doc)
b = MS String
getClassName MS String
-> (String -> MS (CSharpCode MethodData))
-> MS (CSharpCode MethodData)
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\String
n -> String
-> [MS (CSharpCode ParamData)]
-> NamedArgs CSharpCode
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, OOStatement r smt) =>
String
-> [MS (r ParamData)] -> Initializers r -> MS (r Doc) -> MS (r md)
CP.constructor String
n [MS (CSharpCode ParamData)]
ps NamedArgs CSharpCode
is MS (CSharpCode Doc)
b)

  inOutMethod :: String
-> CSharpCode Doc
-> CSharpCode Doc
-> InOutFunc CSharpCode MethodData
inOutMethod String
n CSharpCode Doc
s CSharpCode Doc
p = (VS (CSharpCode TypeData)
 -> [MS (CSharpCode ParamData)]
 -> MS (CSharpCode Doc)
 -> MS (CSharpCode MethodData))
-> InOutFunc CSharpCode MethodData
forall md.
(VS (CSharpCode TypeData)
 -> [MS (CSharpCode ParamData)]
 -> MS (CSharpCode Doc)
 -> MS (CSharpCode md))
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
csInOut (String
-> CSharpCode Doc
-> CSharpCode Doc
-> VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) vis smt md att.
OOMethodSym r vis smt md att =>
String
-> r vis
-> r att
-> VS (r TypeData)
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
method String
n CSharpCode Doc
s CSharpCode Doc
p)
  docInOutMethod :: String
-> CSharpCode Doc
-> CSharpCode Doc
-> DocInOutFunc CSharpCode MethodData
docInOutMethod String
n CSharpCode Doc
s CSharpCode Doc
p = InOutFunc CSharpCode MethodData
-> DocInOutFunc CSharpCode MethodData
forall (r :: * -> *) md.
RenderMethod r md =>
([SVariable r]
 -> [SVariable r] -> [SVariable r] -> MS (r Doc) -> MS (r md))
-> String
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> [(String, SVariable r)]
-> MS (r Doc)
-> MS (r md)
CP.docInOutFunc (String
-> CSharpCode Doc
-> CSharpCode Doc
-> InOutFunc CSharpCode MethodData
forall (r :: * -> *) vis smt md att.
OOMethodSym r vis smt md att =>
String -> r vis -> r att -> InOutFunc r md
inOutMethod String
n CSharpCode Doc
s CSharpCode Doc
p)

instance RenderMethod CSharpCode MethodData where
  commentedFunc :: MS (CSharpCode Doc)
-> MS (CSharpCode MethodData) -> MS (CSharpCode MethodData)
commentedFunc MS (CSharpCode Doc)
cmt MS (CSharpCode MethodData)
m = (CSharpCode MethodData
 -> CSharpCode (Doc -> Doc) -> CSharpCode MethodData)
-> MS (CSharpCode MethodData)
-> State MethodState (CSharpCode (Doc -> Doc))
-> MS (CSharpCode MethodData)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((MethodData -> (Doc -> Doc) -> MethodData)
-> CSharpCode MethodData
-> CSharpCode (Doc -> Doc)
-> CSharpCode MethodData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues MethodData -> (Doc -> Doc) -> MethodData
updateMthd) MS (CSharpCode MethodData)
m
    ((CSharpCode Doc -> CSharpCode (Doc -> Doc))
-> MS (CSharpCode Doc)
-> State MethodState (CSharpCode (Doc -> Doc))
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc -> Doc) -> CSharpCode Doc -> CSharpCode (Doc -> Doc)
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Doc -> Doc -> Doc
R.commentedItem) MS (CSharpCode Doc)
cmt)

  mthdFromData :: VisibilityTag -> Doc -> MS (CSharpCode MethodData)
mthdFromData VisibilityTag
_ Doc
d = CSharpCode MethodData -> MS (CSharpCode MethodData)
forall a s. a -> State s a
toState (CSharpCode MethodData -> MS (CSharpCode MethodData))
-> CSharpCode MethodData -> MS (CSharpCode MethodData)
forall a b. (a -> b) -> a -> b
$ MethodData -> CSharpCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> CSharpCode MethodData)
-> MethodData -> CSharpCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd Doc
d

instance OORenderMethod CSharpCode Doc MethodData Doc where
  intMethod :: Bool
-> String
-> CSharpCode Doc
-> CSharpCode Doc
-> MSMthdType CSharpCode
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
intMethod Bool
m String
n CSharpCode Doc
s CSharpCode Doc
p MSMthdType CSharpCode
t [MS (CSharpCode ParamData)]
ps MS (CSharpCode Doc)
b = do
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (if Bool
m then MethodState -> MethodState
setCurrMain else MethodState -> MethodState
forall a. a -> a
id)
    CSharpCode TypeData
tp <- MSMthdType CSharpCode
t
    [CSharpCode ParamData]
pms <- [MS (CSharpCode ParamData)]
-> StateT MethodState Identity [CSharpCode ParamData]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [MS (CSharpCode ParamData)]
ps
    MethodData -> CSharpCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> CSharpCode MethodData)
-> (CSharpCode Doc -> MethodData)
-> CSharpCode Doc
-> CSharpCode MethodData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc -> MethodData
mthd (Doc -> MethodData)
-> (CSharpCode Doc -> Doc) -> CSharpCode Doc -> MethodData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> CSharpCode Doc
-> CSharpCode Doc
-> CSharpCode TypeData
-> [CSharpCode ParamData]
-> CSharpCode Doc
-> Doc
forall (r :: * -> *) att vis.
(BodyElim r, ParamElim r, PermElim r att, UnRepr r TypeData,
 VisibilityElim r vis) =>
String
-> r vis -> r att -> r TypeData -> [r ParamData] -> r Doc -> Doc
renderMethod String
n CSharpCode Doc
s CSharpCode Doc
p CSharpCode TypeData
tp [CSharpCode ParamData]
pms (CSharpCode Doc -> CSharpCode MethodData)
-> MS (CSharpCode Doc) -> MS (CSharpCode MethodData)
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
<$> MS (CSharpCode Doc)
b
  intFunc :: Bool
-> String
-> CSharpCode Doc
-> CSharpCode Doc
-> MSMthdType CSharpCode
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
intFunc = Bool
-> String
-> CSharpCode Doc
-> CSharpCode Doc
-> MSMthdType CSharpCode
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode MethodData)
forall (r :: * -> *) vis md att.
OORenderMethod r vis md att =>
Bool
-> String
-> r vis
-> r att
-> MSMthdType r
-> [MS (r ParamData)]
-> MS (r Doc)
-> MS (r md)
C.intFunc
  destructor :: forall svr.
[CSStateVar CSharpCode svr] -> MS (CSharpCode MethodData)
destructor [CSStateVar CSharpCode svr]
_ = String -> MS (CSharpCode MethodData)
forall a. HasCallStack => String -> a
error (String -> MS (CSharpCode MethodData))
-> String -> MS (CSharpCode MethodData)
forall a b. (a -> b) -> a -> b
$ String -> String
CP.destructorError String
csName

instance MethodElim CSharpCode MethodData where
  method :: CSharpCode MethodData -> Doc
method = MethodData -> Doc
mthdDoc (MethodData -> Doc)
-> (CSharpCode MethodData -> MethodData)
-> CSharpCode MethodData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode MethodData -> MethodData
forall a. CSharpCode a -> a
unCSC

instance StateVarSym CSharpCode Doc StateVar Doc where
  stateVar :: CSharpCode Doc
-> CSharpCode Doc
-> SVariable CSharpCode
-> CSStateVar CSharpCode Doc
stateVar = CSharpCode Doc
-> CSharpCode Doc
-> SVariable CSharpCode
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis smt md svr att.
(Monad r, OORenderSym r vis smt md svr att) =>
r vis -> r att -> SVariable r -> CS (r Doc)
CP.stateVar
  stateVarDef :: CSharpCode Doc
-> CSharpCode Doc
-> SVariable CSharpCode
-> SValue CSharpCode
-> CSStateVar CSharpCode Doc
stateVarDef = CSharpCode Doc
-> CSharpCode Doc
-> SVariable CSharpCode
-> SValue CSharpCode
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, Monad r) =>
r vis -> r att -> SVariable r -> SValue r -> CS (r Doc)
CP.stateVarDef
  constVar :: CSharpCode Doc
-> SVariable CSharpCode
-> SValue CSharpCode
-> CSStateVar CSharpCode Doc
constVar = Doc
-> CSharpCode Doc
-> SVariable CSharpCode
-> SValue CSharpCode
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis smt md.
(CommonRenderSym r vis smt md, Monad r) =>
Doc -> r vis -> SVariable r -> SValue r -> CS (r Doc)
CP.constVar Doc
empty

instance StateVarElim CSharpCode StateVar where
  stateVar :: CSharpCode Doc -> Doc
stateVar = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

instance ClassSym CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc where
  buildClass :: Maybe String
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
buildClass = Maybe String
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, VisibilitySym r vis) =>
Maybe String
-> [CSStateVar r svr] -> [MS (r md)] -> [MS (r md)] -> CS (r Doc)
G.buildClass
  extraClass :: String
-> Maybe String
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
extraClass = String
-> Maybe String
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, VisibilitySym r vis) =>
String
-> Maybe String
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
CP.extraClass
  implementingClass :: String
-> [String]
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
implementingClass = String
-> [String]
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis md svr.
(RenderClass r vis md svr, VisibilitySym r vis) =>
String
-> [String]
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
G.implementingClass

  docClass :: String -> CSStateVar CSharpCode Doc -> CSStateVar CSharpCode Doc
docClass = String -> CSStateVar CSharpCode Doc -> CSStateVar CSharpCode Doc
forall (r :: * -> *) vis md svr.
RenderClass r vis md svr =>
String -> CS (r Doc) -> CS (r Doc)
CP.doxClass

instance RenderClass CSharpCode Doc MethodData StateVar where
  intClass :: String
-> CSharpCode Doc
-> CSharpCode Doc
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
intClass = (String -> Doc -> Doc -> Doc -> Doc -> Doc)
-> String
-> CSharpCode Doc
-> CSharpCode Doc
-> [CSStateVar CSharpCode Doc]
-> [MS (CSharpCode MethodData)]
-> [MS (CSharpCode MethodData)]
-> CSStateVar CSharpCode Doc
forall (r :: * -> *) md svr vis.
(MethodElim r md, Monad r, StateVarElim r svr,
 VisibilityElim r vis) =>
(String -> Doc -> Doc -> Doc -> Doc -> Doc)
-> String
-> r vis
-> r Doc
-> [CSStateVar r svr]
-> [MS (r md)]
-> [MS (r md)]
-> CS (r Doc)
CP.intClass String -> Doc -> Doc -> Doc -> Doc -> Doc
R.class'

  inherit :: Maybe String -> CSharpCode Doc
inherit = Maybe String -> CSharpCode Doc
forall (r :: * -> *). Monad r => Maybe String -> r Doc
CP.inherit
  implements :: [String] -> CSharpCode Doc
implements = [String] -> CSharpCode Doc
forall (r :: * -> *). Monad r => [String] -> r Doc
CP.implements

  commentedClass :: CSStateVar CSharpCode Doc
-> CSStateVar CSharpCode Doc -> CSStateVar CSharpCode Doc
commentedClass = CSStateVar CSharpCode Doc
-> CSStateVar CSharpCode Doc -> CSStateVar CSharpCode Doc
forall (r :: * -> *).
(BlockCommentElim r, ClassElim r, Monad r) =>
CS (r Doc) -> CS (r Doc) -> CS (r Doc)
G.commentedClass

instance ClassElim CSharpCode where
  class' :: CSharpCode Doc -> Doc
class' = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

instance ModuleSym CSharpCode Doc (Doc, Terminator) MethodData StateVar Doc where
  buildModule :: String
-> [String]
-> [MS (CSharpCode MethodData)]
-> [CSStateVar CSharpCode Doc]
-> FS (CSharpCode Module)
buildModule String
n = String
-> (String -> CSharpCode Doc)
-> [String]
-> [MS (CSharpCode MethodData)]
-> [CSStateVar CSharpCode Doc]
-> FS (CSharpCode Module)
forall (r :: * -> *) vis smt md svr att.
(OORenderSym r vis smt md svr att, UnRepr r Doc) =>
String
-> (String -> r Doc)
-> [String]
-> [MS (r md)]
-> [CS (r Doc)]
-> FS (r Module)
CP.buildModule' String
n String -> CSharpCode Doc
forall (r :: * -> *). ImportSym r => String -> r Doc
langImport

instance RenderMod CSharpCode where
  modFromData :: String -> FS Doc -> FS (CSharpCode Module)
modFromData String
n = String
-> (Doc -> CSharpCode Module) -> FS Doc -> FS (CSharpCode Module)
forall (r :: * -> *).
String -> (Doc -> r Module) -> FS Doc -> FS (r Module)
G.modFromData String
n (Module -> CSharpCode Module
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Module -> CSharpCode Module)
-> (Doc -> Module) -> Doc -> CSharpCode Module
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Module
md String
n)
  updateModuleDoc :: (Doc -> Doc) -> CSharpCode Module -> CSharpCode Module
updateModuleDoc Doc -> Doc
f = (Module -> Module) -> CSharpCode Module -> CSharpCode Module
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> Module -> Module
updateMod Doc -> Doc
f)

instance ModuleElim CSharpCode where
  module' :: CSharpCode Module -> Doc
module' = Module -> Doc
modDoc (Module -> Doc)
-> (CSharpCode Module -> Module) -> CSharpCode Module -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Module -> Module
forall a. CSharpCode a -> a
unCSC

instance BlockCommentSym CSharpCode where
  blockComment :: [String] -> CSharpCode Doc
blockComment [String]
lns = Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> CSharpCode Doc) -> Doc -> CSharpCode Doc
forall a b. (a -> b) -> a -> b
$ [String] -> Doc -> Doc -> Doc
R.blockCmt [String]
lns Doc
blockCmtStart Doc
blockCmtEnd
  docComment :: forall a. State a [String] -> State a (CSharpCode Doc)
docComment = ([String] -> CSharpCode Doc)
-> State a [String] -> State a (CSharpCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue (\[String]
lns -> Doc -> CSharpCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> CSharpCode Doc) -> Doc -> CSharpCode Doc
forall a b. (a -> b) -> a -> b
$ [String] -> Doc -> Doc -> Doc
R.docCmt [String]
lns Doc
docCmtStart
    Doc
blockCmtEnd)

instance BlockCommentElim CSharpCode where
  blockComment' :: CSharpCode Doc -> Doc
blockComment' = CSharpCode Doc -> Doc
forall a. CSharpCode a -> a
unCSC

addSystemImport :: VS a -> VS a
addSystemImport :: forall a. VS a -> VS a
addSystemImport = StateT ValueState Identity ()
-> StateT ValueState Identity a -> StateT ValueState Identity a
forall a b.
StateT ValueState Identity a
-> StateT ValueState Identity b -> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
(>>) (StateT ValueState Identity ()
 -> StateT ValueState Identity a -> StateT ValueState Identity a)
-> StateT ValueState Identity ()
-> StateT ValueState Identity a
-> StateT ValueState Identity a
forall a b. (a -> b) -> a -> b
$ (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS String
csSystem)

csName, csVersion :: String
csName :: String
csName = String
"C#"
csVersion :: String
csVersion = String
"6.0"

csImport :: Label -> Doc
csImport :: String -> Doc
csImport String
n = String -> Doc
text (String
"using " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
n) Doc -> Doc -> Doc
<> Doc
endStatement

csBoolType :: (Monad r) => VS (r TypeData)
csBoolType :: forall (r :: * -> *). Monad r => VS (r TypeData)
csBoolType = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
Boolean String
csBool (String -> Doc
text String
csBool)

csFuncType :: [VS (CSharpCode TypeData)] -> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
csFuncType :: [VS (CSharpCode TypeData)]
-> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
csFuncType [VS (CSharpCode TypeData)]
ps VS (CSharpCode TypeData)
r = do
  [CSharpCode TypeData]
pts <- [VS (CSharpCode TypeData)]
-> StateT ValueState Identity [CSharpCode TypeData]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [VS (CSharpCode TypeData)]
ps
  CSharpCode TypeData
rt <- VS (CSharpCode TypeData)
r
  CodeType -> String -> Doc -> VS (CSharpCode TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData ([CodeType] -> CodeType -> CodeType
Func ((CSharpCode TypeData -> CodeType)
-> [CSharpCode TypeData] -> [CodeType]
forall a b. (a -> b) -> [a] -> [b]
map CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType [CSharpCode TypeData]
pts) (CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType CSharpCode TypeData
rt))
    (String
csFunc String -> String -> String
`containing` String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
listSep ((CSharpCode TypeData -> String)
-> [CSharpCode TypeData] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map CSharpCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString ([CSharpCode TypeData] -> [String])
-> [CSharpCode TypeData] -> [String]
forall a b. (a -> b) -> a -> b
$ [CSharpCode TypeData]
pts [CSharpCode TypeData]
-> [CSharpCode TypeData] -> [CSharpCode TypeData]
forall a. [a] -> [a] -> [a]
++ [CSharpCode TypeData
rt]))
    (String -> Doc
text String
csFunc Doc -> Doc -> Doc
<> Doc -> Doc
angles (Doc -> [Doc] -> Doc
hicat Doc
listSep' ([Doc] -> Doc) -> [Doc] -> Doc
forall a b. (a -> b) -> a -> b
$ (CSharpCode TypeData -> Doc) -> [CSharpCode TypeData] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map CSharpCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType ([CSharpCode TypeData] -> [Doc]) -> [CSharpCode TypeData] -> [Doc]
forall a b. (a -> b) -> a -> b
$ [CSharpCode TypeData]
pts [CSharpCode TypeData]
-> [CSharpCode TypeData] -> [CSharpCode TypeData]
forall a. [a] -> [a] -> [a]
++ [CSharpCode TypeData
rt]))

csForEach, csNamedArgSep, csLambdaSep :: Doc
csForEach :: Doc
csForEach = String -> Doc
text String
"foreach"
csNamedArgSep :: Doc
csNamedArgSep = Doc
colon Doc -> Doc -> Doc
<> Doc
space
csLambdaSep :: Doc
csLambdaSep = String -> Doc
text String
"=>"

csSystem, csConsole, csGeneric, csDiagnostics, csIO, csList, csSet, csInt, csFloat, csBool,
  csChar, csParse, csReader, csWriter, csReadLine, csWrite, csWriteLine,
  csIndex, csContains, csListAdd, csListSize, csListAppend, csListRemove,
  csClose, csEOS, csSplit, csMain, csFunc, csUnionWith :: String
csSystem :: String
csSystem = String
"System"
csConsole :: String
csConsole = String
"Console"
csGeneric :: String
csGeneric = String -> String
csSysAccess (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
"Collections" String -> String -> String
`access` String
"Generic"
csDiagnostics :: String
csDiagnostics = String -> String
csSysAccess String
"Diagnostics"
csIO :: String
csIO = String -> String
csSysAccess String
"IO"
csList :: String
csList = String
"List"
csSet :: String
csSet = String
"HashSet"
csInt :: String
csInt = String
"Int32"
csFloat :: String
csFloat = String
"Single"
csBool :: String
csBool = String
"Boolean"
csChar :: String
csChar = String
"Char"
csParse :: String
csParse = String
"Parse"
csReader :: String
csReader = String
"StreamReader"
csWriter :: String
csWriter = String
"StreamWriter"
csReadLine :: String
csReadLine = String
"ReadLine"
csWrite :: String
csWrite = String
"Write"
csWriteLine :: String
csWriteLine = String
"WriteLine"
csIndex :: String
csIndex = String
"IndexOf"
csContains :: String
csContains = String
"Contains"
csListAdd :: String
csListAdd = String
"Insert"
csListSize :: String
csListSize = String
"Count"
csListAppend :: String
csListAppend = String
"Add"
csListRemove :: String
csListRemove = String
"Remove"
csClose :: String
csClose = String
"Close"
csEOS :: String
csEOS = String
"EndOfStream"
csSplit :: String
csSplit = String
"Split"
csMain :: String
csMain = String
"Main"
csFunc :: String
csFunc = String
"Func"
csUnionWith :: String
csUnionWith = String
"UnionWith"

csSysAccess :: String -> String
csSysAccess :: String -> String
csSysAccess = String -> String -> String
access String
csSystem

csUnaryMath :: (Monad r) => String -> VSOp r
csUnaryMath :: forall (r :: * -> *). Monad r => String -> VSOp r
csUnaryMath = VS (r OpData) -> VS (r OpData)
forall a. VS a -> VS a
addSystemImport (VS (r OpData) -> VS (r OpData))
-> (String -> VS (r OpData)) -> String -> VS (r OpData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> VS (r OpData)
forall (r :: * -> *). Monad r => String -> VSOp r
unOpPrec (String -> VS (r OpData))
-> (String -> String) -> String -> VS (r OpData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
mathFunc

csInfileType :: (Monad r) => VS (r TypeData)
csInfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
csInfileType = StateT
  ValueState Identity (StateT ValueState Identity (r TypeData))
-> StateT ValueState Identity (r TypeData)
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (StateT
   ValueState Identity (StateT ValueState Identity (r TypeData))
 -> StateT ValueState Identity (r TypeData))
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
-> StateT ValueState Identity (r TypeData)
forall a b. (a -> b) -> a -> b
$ (ValueState -> ValueState)
-> StateT ValueState Identity (r TypeData)
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS String
csIO) (StateT ValueState Identity (r TypeData)
 -> StateT
      ValueState Identity (StateT ValueState Identity (r TypeData)))
-> StateT ValueState Identity (r TypeData)
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
forall a b. (a -> b) -> a -> b
$
  CodeType
-> String -> Doc -> StateT ValueState Identity (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
InFile String
csReader (String -> Doc
text String
csReader)

csOutfileType :: (Monad r) => VS (r TypeData)
csOutfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
csOutfileType = StateT
  ValueState Identity (StateT ValueState Identity (r TypeData))
-> StateT ValueState Identity (r TypeData)
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (StateT
   ValueState Identity (StateT ValueState Identity (r TypeData))
 -> StateT ValueState Identity (r TypeData))
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
-> StateT ValueState Identity (r TypeData)
forall a b. (a -> b) -> a -> b
$ (ValueState -> ValueState)
-> StateT ValueState Identity (r TypeData)
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
forall s a. (s -> s) -> a -> State s a
modifyReturn (String -> ValueState -> ValueState
addLangImportVS String
csIO) (StateT ValueState Identity (r TypeData)
 -> StateT
      ValueState Identity (StateT ValueState Identity (r TypeData)))
-> StateT ValueState Identity (r TypeData)
-> StateT
     ValueState Identity (StateT ValueState Identity (r TypeData))
forall a b. (a -> b) -> a -> b
$
  CodeType
-> String -> Doc -> StateT ValueState Identity (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
OutFile String
csWriter (String -> Doc
text String
csWriter)

csLitList :: (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)) ->
  VS (CSharpCode TypeData) -> [SValue CSharpCode] -> SValue CSharpCode
csLitList :: (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData))
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
csLitList VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
f VS (CSharpCode TypeData)
t' [SValue CSharpCode]
es' = do
  [CSharpCode Value]
es <- [SValue CSharpCode]
-> StateT ValueState Identity [CSharpCode Value]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [SValue CSharpCode]
es'
  CSharpCode TypeData
lt <- VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
f VS (CSharpCode TypeData)
t'
  CSharpCode TypeData -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
r TypeData -> Doc -> SValue r
mkVal CSharpCode TypeData
lt (Doc
new' Doc -> Doc -> Doc
<+> CSharpCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType CSharpCode TypeData
lt
    Doc -> Doc -> Doc
<+> Doc -> Doc
braces ([CSharpCode Value] -> Doc
forall (r :: * -> *). ValueElim r => [r Value] -> Doc
valueList [CSharpCode Value]
es))

csLambda :: [CSharpCode BinderD] -> CSharpCode Value -> Doc
csLambda :: [CSharpCode BinderD] -> CSharpCode Value -> Doc
csLambda [CSharpCode BinderD]
ps CSharpCode Value
ex = Doc -> Doc
parens ([CSharpCode BinderD] -> Doc
forall (r :: * -> *). InternalBinderElim r => [r BinderD] -> Doc
binderList [CSharpCode BinderD]
ps) Doc -> Doc -> Doc
<+> Doc
csLambdaSep Doc -> Doc -> Doc
<+> CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value CSharpCode Value
ex

csReadLineFunc :: SValue CSharpCode
csReadLineFunc :: SValue CSharpCode
csReadLineFunc = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
csConsole String
csReadLine VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string []

csIntParse :: SValue CSharpCode -> SValue CSharpCode
csIntParse :: SValue CSharpCode -> SValue CSharpCode
csIntParse SValue CSharpCode
v = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
csInt String
csParse VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
int [SValue CSharpCode
v]

csFloatParse :: SValue CSharpCode -> SValue CSharpCode
csFloatParse :: SValue CSharpCode -> SValue CSharpCode
csFloatParse SValue CSharpCode
v = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
csFloat String
csParse VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
float [SValue CSharpCode
v]

csDblParse :: SValue CSharpCode -> SValue CSharpCode
csDblParse :: SValue CSharpCode -> SValue CSharpCode
csDblParse SValue CSharpCode
v = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
CP.doubleRender String
csParse VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
double [SValue CSharpCode
v]

csBoolParse :: SValue CSharpCode -> SValue CSharpCode
csBoolParse :: SValue CSharpCode -> SValue CSharpCode
csBoolParse SValue CSharpCode
v = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
csBool String
csParse VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
bool [SValue CSharpCode
v]

csCharParse :: SValue CSharpCode -> SValue CSharpCode
csCharParse :: SValue CSharpCode -> SValue CSharpCode
csCharParse SValue CSharpCode
v = String
-> String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
csChar String
csParse VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
char [SValue CSharpCode
v]

csSplitFunc :: Char -> VS (CSharpCode FuncData)
csSplitFunc :: Char -> VS (CSharpCode FuncData)
csSplitFunc Char
d = String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> VS (CSharpCode FuncData)
forall (r :: * -> *).
OOFunctionSym r =>
String -> VS (r TypeData) -> [SValue r] -> VS (r FuncData)
func String
csSplit (VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
VS (r TypeData) -> VS (r TypeData)
listType VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string) [Char -> SValue CSharpCode
forall (r :: * -> *). Literal r => Char -> SValue r
litChar Char
d]

csCast :: VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csCast :: VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csCast = StateT ValueState Identity (SValue CSharpCode) -> SValue CSharpCode
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (StateT ValueState Identity (SValue CSharpCode)
 -> SValue CSharpCode)
-> (VS (CSharpCode TypeData)
    -> SValue CSharpCode
    -> StateT ValueState Identity (SValue CSharpCode))
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> SValue CSharpCode
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (CSharpCode TypeData -> CSharpCode Value -> SValue CSharpCode)
-> VS (CSharpCode TypeData)
-> SValue CSharpCode
-> StateT ValueState Identity (SValue CSharpCode)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues (\CSharpCode TypeData
t CSharpCode Value
v -> CodeType
-> CodeType
-> CSharpCode TypeData
-> CSharpCode Value
-> SValue CSharpCode
csCast' (CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType CSharpCode TypeData
t) (CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (CSharpCode TypeData -> CodeType)
-> CSharpCode TypeData -> CodeType
forall a b. (a -> b) -> a -> b
$
  CSharpCode Value -> CSharpCode TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType CSharpCode Value
v) CSharpCode TypeData
t CSharpCode Value
v)
  where csCast' :: CodeType
-> CodeType
-> CSharpCode TypeData
-> CSharpCode Value
-> SValue CSharpCode
csCast' CodeType
Double CodeType
String CSharpCode TypeData
_ CSharpCode Value
v = SValue CSharpCode -> SValue CSharpCode
csDblParse (CSharpCode Value -> SValue CSharpCode
forall a s. a -> State s a
toState CSharpCode Value
v)
        csCast' CodeType
Float CodeType
String CSharpCode TypeData
_ CSharpCode Value
v = SValue CSharpCode -> SValue CSharpCode
csFloatParse (CSharpCode Value -> SValue CSharpCode
forall a s. a -> State s a
toState CSharpCode Value
v)
        csCast' CodeType
_ CodeType
_ CSharpCode TypeData
t CSharpCode Value
v = VS (CSharpCode TypeData) -> Doc -> SValue CSharpCode
forall (r :: * -> *).
RenderValue r =>
VS (r TypeData) -> Doc -> SValue r
mkStateVal (CSharpCode TypeData -> VS (CSharpCode TypeData)
forall a s. a -> State s a
toState CSharpCode TypeData
t) (Doc -> Doc -> Doc
R.castObj (Doc -> Doc
R.cast
          (CSharpCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType CSharpCode TypeData
t)) (CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value CSharpCode Value
v))

-- This implementation generates a statement lambda to define the function.
-- C# 7 supports local functions, which would be a cleaner way to implement
-- this, but the mcs compiler used in our Travis builds does not yet support
-- all features of C# 7, so we cannot generate local functions.
-- If support for local functions is added to mcs in the future, this
-- should be re-written to generate a local function.
csFuncDecDef :: SVariable CSharpCode -> CSharpCode ScopeData ->
  [SVariable CSharpCode] -> MS (CSharpCode Body) -> MS (CSharpCode (Doc, Terminator))
csFuncDecDef :: SVariable CSharpCode
-> CSharpCode ScopeData
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
csFuncDecDef SVariable CSharpCode
v CSharpCode ScopeData
scp [SVariable CSharpCode]
ps MS (CSharpCode Doc)
bod = do
  CSharpCode Variable
vr <- LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Variable))
  MethodState
  ValueState
-> SVariable CSharpCode
-> StateT MethodState Identity (CSharpCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Variable) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS SVariable CSharpCode
v
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> MethodState -> MethodState
useVarName (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ CSharpCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName CSharpCode Variable
vr
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((MethodState -> MethodState) -> StateT MethodState Identity ())
-> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall a b. (a -> b) -> a -> b
$ String -> ScopeData -> MethodState -> MethodState
setVarScope (CSharpCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName CSharpCode Variable
vr) (CSharpCode ScopeData -> ScopeData
forall (r :: * -> *). ScopeElim r => r ScopeData -> ScopeData
scopeData CSharpCode ScopeData
scp)
  [CSharpCode Variable]
pms <- (SVariable CSharpCode
 -> StateT MethodState Identity (CSharpCode Variable))
-> [SVariable CSharpCode]
-> StateT MethodState Identity [CSharpCode Variable]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode Variable))
  MethodState
  ValueState
-> SVariable CSharpCode
-> StateT MethodState Identity (CSharpCode Variable)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode Variable) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS) [SVariable CSharpCode]
ps
  CSharpCode TypeData
t <- LensLike'
  (Zoomed (StateT ValueState Identity) (CSharpCode TypeData))
  MethodState
  ValueState
-> VS (CSharpCode TypeData) -> MSMthdType CSharpCode
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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) (CSharpCode TypeData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (CSharpCode TypeData) ValueState)
-> MethodState
-> Focusing Identity (CSharpCode TypeData) MethodState
Lens' MethodState ValueState
lensMStoVS (VS (CSharpCode TypeData) -> MSMthdType CSharpCode)
-> VS (CSharpCode TypeData) -> MSMthdType CSharpCode
forall a b. (a -> b) -> a -> b
$ [VS (CSharpCode TypeData)]
-> VS (CSharpCode TypeData) -> VS (CSharpCode TypeData)
forall (r :: * -> *).
TypeSym r =>
[VS (r TypeData)] -> VS (r TypeData) -> VS (r TypeData)
funcType ((CSharpCode Variable -> VS (CSharpCode TypeData))
-> [CSharpCode Variable] -> [VS (CSharpCode TypeData)]
forall a b. (a -> b) -> [a] -> [b]
map (CSharpCode TypeData -> VS (CSharpCode TypeData)
forall a. a -> StateT ValueState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CSharpCode TypeData -> VS (CSharpCode TypeData))
-> (CSharpCode Variable -> CSharpCode TypeData)
-> CSharpCode Variable
-> VS (CSharpCode TypeData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType) [CSharpCode Variable]
pms)
    (CSharpCode TypeData -> VS (CSharpCode TypeData)
forall a. a -> StateT ValueState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CSharpCode TypeData -> VS (CSharpCode TypeData))
-> CSharpCode TypeData -> VS (CSharpCode TypeData)
forall a b. (a -> b) -> a -> b
$ CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType CSharpCode Variable
vr)
  CSharpCode Doc
b <- MS (CSharpCode Doc)
bod
  (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> MethodState -> MethodState
addLangImport String
csSystem)
  Doc -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
RenderStatement r smt =>
Doc -> MS (r smt)
mkStmt (Doc -> MS (CSharpCode (Doc, Terminator)))
-> Doc -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ CSharpCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType CSharpCode TypeData
t Doc -> Doc -> Doc
<+> String -> Doc
text (CSharpCode Variable -> String
forall (r :: * -> *). VariableElim r => r Variable -> String
variableName CSharpCode Variable
vr) Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+>
    Doc -> Doc
parens ([CSharpCode Variable] -> Doc
forall (r :: * -> *). InternalVarElim r => [r Variable] -> Doc
variableList [CSharpCode Variable]
pms) Doc -> Doc -> Doc
<+> Doc
csLambdaSep Doc -> Doc -> Doc
<+> Doc
bodyStart Doc -> Doc -> Doc
$$
    Doc -> Doc
indent (CSharpCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body CSharpCode Doc
b) Doc -> Doc -> Doc
$$ Doc
bodyEnd

csThrowDoc :: CSharpCode Value -> Doc
csThrowDoc :: CSharpCode Value -> Doc
csThrowDoc CSharpCode Value
errMsg = Doc
throwLabel Doc -> Doc -> Doc
<+> Doc
new' Doc -> Doc -> Doc
<+> Doc
exceptionObj' Doc -> Doc -> Doc
<>
  Doc -> Doc
parens (CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value CSharpCode Value
errMsg)

csTryCatch :: CSharpCode Body -> CSharpCode Body -> Doc
csTryCatch :: CSharpCode Doc -> CSharpCode Doc -> Doc
csTryCatch CSharpCode Doc
tb CSharpCode Doc
cb = [Doc] -> Doc
vcat [
  Doc
tryLabel Doc -> Doc -> Doc
<+> Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ CSharpCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body CSharpCode Doc
tb,
  Doc
rbrace Doc -> Doc -> Doc
<+> Doc
catchLabel Doc -> Doc -> Doc
<+>
    Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ CSharpCode Doc -> Doc
forall (r :: * -> *). BodyElim r => r Doc -> Doc
RC.body CSharpCode Doc
cb,
  Doc
rbrace]

csAssert :: CSharpCode Value -> CSharpCode Value -> Doc
csAssert :: CSharpCode Value -> CSharpCode Value -> Doc
csAssert CSharpCode Value
condition CSharpCode Value
errorMessage = [Doc] -> Doc
vcat [
  String -> Doc
text String
"Debug.Assert(" Doc -> Doc -> Doc
<+> CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value CSharpCode Value
condition Doc -> Doc -> Doc
<+> String -> Doc
text String
"," Doc -> Doc -> Doc
<+> CSharpCode Value -> Doc
forall (r :: * -> *). ValueElim r => r Value -> Doc
RC.value CSharpCode Value
errorMessage Doc -> Doc -> Doc
<> String -> Doc
text String
")" Doc -> Doc -> Doc
<> Doc
semi
  ]

csDiscardInput :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
csDiscardInput :: SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
csDiscardInput = SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt

csFileInput :: (InternalValueExp r) => SValue r -> SValue r
csFileInput :: forall (r :: * -> *). InternalValueExp r => SValue r -> SValue r
csFileInput SValue r
f = VS (r TypeData) -> SValue r -> String -> SValue r
forall (r :: * -> *).
InternalValueExp r =>
VS (r TypeData) -> SValue r -> String -> SValue r
objMethodCallNoParams VS (r TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string SValue r
f String
csReadLine

csInput :: VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csInput :: VS (CSharpCode TypeData) -> SValue CSharpCode -> SValue CSharpCode
csInput VS (CSharpCode TypeData)
tp SValue CSharpCode
inFn = do
  CSharpCode TypeData
t <- VS (CSharpCode TypeData)
tp
  CodeType -> SValue CSharpCode -> SValue CSharpCode
forall {a}. CodeType -> VS a -> VS a
csInputImport (CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType CSharpCode TypeData
t) (CodeType -> SValue CSharpCode -> SValue CSharpCode
csInput' (CSharpCode TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType CSharpCode TypeData
t) SValue CSharpCode
inFn)
  where csInput' :: CodeType -> SValue CSharpCode -> SValue CSharpCode
csInput' CodeType
Integer = SValue CSharpCode -> SValue CSharpCode
csIntParse
        csInput' CodeType
Float = SValue CSharpCode -> SValue CSharpCode
csFloatParse
        csInput' CodeType
Double = SValue CSharpCode -> SValue CSharpCode
csDblParse
        csInput' CodeType
Boolean = SValue CSharpCode -> SValue CSharpCode
csBoolParse
        csInput' CodeType
String = SValue CSharpCode -> SValue CSharpCode
forall a. a -> a
id
        csInput' CodeType
Char = SValue CSharpCode -> SValue CSharpCode
csCharParse
        csInput' CodeType
_ = String -> SValue CSharpCode -> SValue CSharpCode
forall a. HasCallStack => String -> a
error String
"Attempt to read value of unreadable type"
        csInputImport :: CodeType -> VS a -> VS a
csInputImport CodeType
t = if CodeType
t CodeType -> [CodeType] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [CodeType
Integer, CodeType
Float, CodeType
Double, CodeType
Boolean, CodeType
Char]
          then VS a -> VS a
forall a. VS a -> VS a
addSystemImport else VS a -> VS a
forall a. a -> a
id

csOpenFileR :: (OOValueExpression r) => SValue r -> VS (r TypeData) -> SValue r
csOpenFileR :: forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r
csOpenFileR SValue r
n VS (r TypeData)
r = PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
r [SValue r
n]

csOpenFileWorA :: (OOValueExpression r) => SValue r ->
  VS (r TypeData) -> SValue r -> SValue r
csOpenFileWorA :: forall (r :: * -> *).
OOValueExpression r =>
SValue r -> VS (r TypeData) -> SValue r -> SValue r
csOpenFileWorA SValue r
n VS (r TypeData)
w SValue r
a = PosCtorCall r
forall (r :: * -> *). OOValueExpression r => PosCtorCall r
newObj VS (r TypeData)
w [SValue r
n, SValue r
a]

csRef :: Doc -> Doc
csRef :: Doc -> Doc
csRef Doc
p = String -> Doc
text String
"ref" Doc -> Doc -> Doc
<+> Doc
p

csOut :: Doc -> Doc
csOut :: Doc -> Doc
csOut Doc
p = String -> Doc
text String
"out" Doc -> Doc -> Doc
<+> Doc
p

csInOutCall :: (Label -> VS (CSharpCode TypeData) -> [SValue CSharpCode] ->
  SValue CSharpCode) -> Label -> [SValue CSharpCode] -> [SVariable CSharpCode]
  -> [SVariable CSharpCode] -> MS (CSharpCode (Doc, Terminator))
csInOutCall :: (String
 -> VS (CSharpCode TypeData)
 -> [SValue CSharpCode]
 -> SValue CSharpCode)
-> InOutCall CSharpCode (Doc, Terminator)
csInOutCall String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n [SValue CSharpCode]
ins [SVariable CSharpCode
out] [] = SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable CSharpCode
out (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
out)
  [SValue CSharpCode]
ins
csInOutCall String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n [SValue CSharpCode]
ins [] [SVariable CSharpCode
out] = SVariable CSharpCode
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
AssignStatement r smt =>
SVariable r -> SValue r -> MS (r smt)
assign SVariable CSharpCode
out (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
out)
  (SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable CSharpCode
out SValue CSharpCode -> [SValue CSharpCode] -> [SValue CSharpCode]
forall a. a -> [a] -> [a]
: [SValue CSharpCode]
ins)
csInOutCall String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n [SValue CSharpCode]
ins [SVariable CSharpCode]
outs [SVariable CSharpCode]
both = SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
StatementSym r smt =>
SValue r -> MS (r smt)
valStmt (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ String
-> VS (CSharpCode TypeData)
-> [SValue CSharpCode]
-> SValue CSharpCode
f String
n VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void ((SVariable CSharpCode -> SValue CSharpCode)
-> [SVariable CSharpCode] -> [SValue CSharpCode]
forall a b. (a -> b) -> [a] -> [b]
map ((CSharpCode Value -> CSharpCode Value)
-> SValue CSharpCode -> SValue CSharpCode
forall a b s. (a -> b) -> State s a -> State s b
onStateValue
  ((Value -> Value) -> CSharpCode Value -> CSharpCode Value
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> Value -> Value
updateValDoc Doc -> Doc
csRef)) (SValue CSharpCode -> SValue CSharpCode)
-> (SVariable CSharpCode -> SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf) [SVariable CSharpCode]
both [SValue CSharpCode] -> [SValue CSharpCode] -> [SValue CSharpCode]
forall a. [a] -> [a] -> [a]
++ [SValue CSharpCode]
ins [SValue CSharpCode] -> [SValue CSharpCode] -> [SValue CSharpCode]
forall a. [a] -> [a] -> [a]
++ (SVariable CSharpCode -> SValue CSharpCode)
-> [SVariable CSharpCode] -> [SValue CSharpCode]
forall a b. (a -> b) -> [a] -> [b]
map
  ((CSharpCode Value -> CSharpCode Value)
-> SValue CSharpCode -> SValue CSharpCode
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Value -> Value) -> CSharpCode Value -> CSharpCode Value
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> Value -> Value
updateValDoc Doc -> Doc
csOut)) (SValue CSharpCode -> SValue CSharpCode)
-> (SVariable CSharpCode -> SValue CSharpCode)
-> SVariable CSharpCode
-> SValue CSharpCode
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf) [SVariable CSharpCode]
outs)

csVarDec :: AttachmentTag -> MS (CSharpCode smt) -> MS (CSharpCode smt)
csVarDec :: forall smt.
AttachmentTag -> MS (CSharpCode smt) -> MS (CSharpCode smt)
csVarDec AttachmentTag
ClassLevel MS (CSharpCode smt)
_ = String -> MS (CSharpCode smt)
forall a. HasCallStack => String -> a
error String
"ClassLevel variables can't be declared locally to a function in C#. Use stateVar to make a ClassLevel state variable instead."
csVarDec AttachmentTag
InstanceLevel MS (CSharpCode smt)
d = MS (CSharpCode smt)
d

csInOut :: (VS (CSharpCode TypeData) -> [MS (CSharpCode ParamData)] ->
  MS (CSharpCode Body) -> MS (CSharpCode md)) ->
  [SVariable CSharpCode] -> [SVariable CSharpCode] -> [SVariable CSharpCode] ->
  MS (CSharpCode Body) -> MS (CSharpCode md)
csInOut :: forall md.
(VS (CSharpCode TypeData)
 -> [MS (CSharpCode ParamData)]
 -> MS (CSharpCode Doc)
 -> MS (CSharpCode md))
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> [SVariable CSharpCode]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
csInOut VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f [SVariable CSharpCode]
ins [SVariable CSharpCode
v] [] MS (CSharpCode Doc)
b = VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
v) ((SVariable CSharpCode -> MS (CSharpCode ParamData))
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param [SVariable CSharpCode]
ins)
  ((CSharpCode (Doc, Terminator)
 -> CSharpCode Doc
 -> CSharpCode (Doc, Terminator)
 -> CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode Doc)
forall a b c d s.
(a -> b -> c -> d)
-> State s a -> State s b -> State s c -> State s d
on3StateValues (((Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc)
-> CSharpCode (Doc, Terminator)
-> CSharpCode Doc
-> CSharpCode (Doc, Terminator)
-> CSharpCode Doc
forall (r :: * -> *) a b c d.
Applicative r =>
(a -> b -> c -> d) -> r a -> r b -> r c -> r d
on3CodeValues (Doc, Terminator) -> Doc -> (Doc, Terminator) -> Doc
surroundBody) (SVariable CSharpCode
-> CSharpCode ScopeData -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
DeclStatement r smt =>
SVariable r -> r ScopeData -> MS (r smt)
varDec SVariable CSharpCode
v CSharpCode ScopeData
forall (r :: * -> *). ScopeSym r => r ScopeData
local) MS (CSharpCode Doc)
b (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$
  SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable CSharpCode
v))
csInOut VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f [SVariable CSharpCode]
ins [] [SVariable CSharpCode
v] MS (CSharpCode Doc)
b = VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f ((CSharpCode Variable -> CSharpCode TypeData)
-> SVariable CSharpCode -> VS (CSharpCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue CSharpCode Variable -> CSharpCode TypeData
forall (r :: * -> *). VariableElim r => r Variable -> r TypeData
variableType SVariable CSharpCode
v)
  ((SVariable CSharpCode -> MS (CSharpCode ParamData))
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param ([SVariable CSharpCode] -> [MS (CSharpCode ParamData)])
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> a -> b
$ SVariable CSharpCode
v SVariable CSharpCode
-> [SVariable CSharpCode] -> [SVariable CSharpCode]
forall a. a -> [a] -> [a]
: [SVariable CSharpCode]
ins) ((CSharpCode Doc -> CSharpCode (Doc, Terminator) -> CSharpCode Doc)
-> MS (CSharpCode Doc)
-> MS (CSharpCode (Doc, Terminator))
-> MS (CSharpCode Doc)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((Doc -> (Doc, Terminator) -> Doc)
-> CSharpCode Doc -> CSharpCode (Doc, Terminator) -> CSharpCode Doc
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues Doc -> (Doc, Terminator) -> Doc
appendToBody) MS (CSharpCode Doc)
b
  (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall (r :: * -> *) smt.
ControlStatement r smt =>
SValue r -> MS (r smt)
returnStmt (SValue CSharpCode -> MS (CSharpCode (Doc, Terminator)))
-> SValue CSharpCode -> MS (CSharpCode (Doc, Terminator))
forall a b. (a -> b) -> a -> b
$ SVariable CSharpCode -> SValue CSharpCode
forall (r :: * -> *). VariableValue r => SVariable r -> SValue r
valueOf SVariable CSharpCode
v))
csInOut VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f [SVariable CSharpCode]
ins [SVariable CSharpCode]
outs [SVariable CSharpCode]
both MS (CSharpCode Doc)
b = VS (CSharpCode TypeData)
-> [MS (CSharpCode ParamData)]
-> MS (CSharpCode Doc)
-> MS (CSharpCode md)
f VS (CSharpCode TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
void ((SVariable CSharpCode -> MS (CSharpCode ParamData))
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map ((CSharpCode ParamData -> CSharpCode ParamData)
-> MS (CSharpCode ParamData) -> MS (CSharpCode ParamData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((ParamData -> ParamData)
-> CSharpCode ParamData -> CSharpCode ParamData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue
  ((Doc -> Doc) -> ParamData -> ParamData
updateParam Doc -> Doc
csRef)) (MS (CSharpCode ParamData) -> MS (CSharpCode ParamData))
-> (SVariable CSharpCode -> MS (CSharpCode ParamData))
-> SVariable CSharpCode
-> MS (CSharpCode ParamData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param) [SVariable CSharpCode]
both [MS (CSharpCode ParamData)]
-> [MS (CSharpCode ParamData)] -> [MS (CSharpCode ParamData)]
forall a. [a] -> [a] -> [a]
++ (SVariable CSharpCode -> MS (CSharpCode ParamData))
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param [SVariable CSharpCode]
ins [MS (CSharpCode ParamData)]
-> [MS (CSharpCode ParamData)] -> [MS (CSharpCode ParamData)]
forall a. [a] -> [a] -> [a]
++ (SVariable CSharpCode -> MS (CSharpCode ParamData))
-> [SVariable CSharpCode] -> [MS (CSharpCode ParamData)]
forall a b. (a -> b) -> [a] -> [b]
map ((CSharpCode ParamData -> CSharpCode ParamData)
-> MS (CSharpCode ParamData) -> MS (CSharpCode ParamData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue
  ((ParamData -> ParamData)
-> CSharpCode ParamData -> CSharpCode ParamData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> ParamData -> ParamData
updateParam Doc -> Doc
csOut)) (MS (CSharpCode ParamData) -> MS (CSharpCode ParamData))
-> (SVariable CSharpCode -> MS (CSharpCode ParamData))
-> SVariable CSharpCode
-> MS (CSharpCode ParamData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SVariable CSharpCode -> MS (CSharpCode ParamData)
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MS (r ParamData)
param) [SVariable CSharpCode]
outs) MS (CSharpCode Doc)
b

csPrint
  :: (InternalIOStmt r smt, SharedStatement r smt, TypeElim r)
  => Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint :: forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
csPrint Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v = LensLike'
  (Zoomed (StateT ValueState Identity) (r Value))
  MethodState
  ValueState
-> SValue r -> StateT MethodState Identity (r Value)
forall c.
LensLike'
  (Zoomed (StateT ValueState Identity) c) MethodState ValueState
-> StateT ValueState Identity c -> StateT MethodState Identity c
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 Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (r Value) ValueState)
-> MethodState -> Focusing Identity (r Value) MethodState
Lens' MethodState ValueState
lensMStoVS SValue r
v StateT MethodState Identity (r Value)
-> (r Value -> StateT MethodState Identity (r smt))
-> StateT MethodState Identity (r smt)
forall a b.
StateT MethodState Identity a
-> (a -> StateT MethodState Identity b)
-> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CodeType -> StateT MethodState Identity (r smt)
csPrint' (CodeType -> StateT MethodState Identity (r smt))
-> (r Value -> CodeType)
-> r Value
-> StateT MethodState Identity (r smt)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall (r :: * -> *). TypeElim r => r TypeData -> CodeType
getCodeType (r TypeData -> CodeType)
-> (r Value -> r TypeData) -> r Value -> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r Value -> r TypeData
forall (r :: * -> *). ValueSym r => r Value -> r TypeData
valueType
  where csPrint' :: CodeType -> StateT MethodState Identity (r smt)
csPrint' (Array CodeType
_) = [StateT MethodState Identity (r smt)]
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
StatementSym r smt =>
[MS (r smt)] -> MS (r smt)
multi [String -> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt. IOStatement r smt => String -> MS (r smt)
printStr String
"[",
          SValue r -> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
IOStatement r smt =>
SValue r -> MS (r smt)
print (SValue r -> StateT MethodState Identity (r smt))
-> SValue r -> StateT MethodState Identity (r smt)
forall a b. (a -> b) -> a -> b
$ String -> PosCall r
forall (r :: * -> *). ValueExpression r => String -> PosCall r
extFuncApp String
"string" String
"Join" VS (r TypeData)
forall (r :: * -> *). TypeSym r => VS (r TypeData)
string [String -> SValue r
forall (r :: * -> *). Literal r => String -> SValue r
litString String
", ", SValue r
v],
          SValue r -> StateT MethodState Identity (r smt)
printMaybeNewLn (SValue r -> StateT MethodState Identity (r smt))
-> SValue r -> StateT MethodState Identity (r smt)
forall a b. (a -> b) -> a -> b
$ String -> SValue r
forall (r :: * -> *). Literal r => String -> SValue r
litString String
"]"]
        csPrint' CodeType
_ = Bool
-> Maybe (SValue r)
-> SValue r
-> SValue r
-> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
(InternalIOStmt r smt, SharedStatement r smt, TypeElim r) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MS (r smt)
G.print Bool
newLn Maybe (SValue r)
f SValue r
printFn SValue r
v
        printMaybeNewLn :: SValue r -> StateT MethodState Identity (r smt)
printMaybeNewLn = if Bool
newLn then SValue r -> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
IOStatement r smt =>
SValue r -> MS (r smt)
printLn else SValue r -> StateT MethodState Identity (r smt)
forall (r :: * -> *) smt.
IOStatement r smt =>
SValue r -> MS (r smt)
print