{-# LANGUAGE TypeFamilies #-}
-- | The logic to render Java code is contained in this module
module Drasil.GOOL.LanguageRenderer.JavaRenderer (
  -- * Java Code Configuration -- defines syntax of all Java code
  JavaCode(..), jName, jVersion
) where

import Drasil.FileHandling.Legacy (indent)

import Drasil.Shared.CodeType (CodeType(..))
import Drasil.Shared.InterfaceCommon (UnRepr(..), Label, Body, Block, Variable,
  Value, 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(..), ListStatement(..), Set(..),
  InternalList(..), EmptyStatement(..), MultiStatement(..), ValueStatement(..),
  AssignStatement(..), (&=), DeclStatement(..), PrintConsole(..),
  ReadConsole(..), FileHandling(..), PrintFile(..), ReadFile(..),
  StringStatement(..), FuncAppStatement(..), CommentStatement(..), BinderSym(..),
  BinderElim(..), ControlStatement(..), ScopeSym(..), ParameterSym(..),
  MethodSym(..))
import Drasil.GOOL.InterfaceGOOL (Class, StateVar, CSStateVar, OOProg,
  ProgramSym(..), FileSym(..), ModuleSym(..), ClassSym(..), OOTypeSym(..),
  OOVariableSym(..), SelfSym(..), StateVarSym(..), AttachmentSym(..),
  OOValueExpression(..), objMethodCall, selfMethodCall, newObj,
  InternalValueExp(..), 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.Shared.LanguageRenderer (new, elseIfLabel, forLabel, tryLabel,
  catchLabel, throwLabel, throwsLabel, importLabel, blockCmtStart, blockCmtEnd,
  docCmtStart, bodyStart, bodyEnd, endStatement, commentStart, exceptionObj',
  new', args, printLabel, exceptionObj, mainFunc, new, nullLabel, listSep,
  access, containing, mathFunc, functionDox, variableList,
  parameterList, appendToBody, surroundBody, valueList)
import qualified Drasil.Shared.LanguageRenderer as R (sqrt, abs, log10,
  log, exp, sin, cos, tan, asin, acos, atan, floor, ceil, pow, package, class',
  multiStmt, body, printFile, classVarAccess, cast, castObj,
  classLevel, instanceLevel, break, continue, private, public, blockCmt, docCmt,
  addComments, commentedMod, commentedItem)
import Drasil.GOOL.Renderers (renderType, renderParam, renderListDec)
import Drasil.Shared.LanguageRenderer.Constructors (mkStmt, mkStateVal, mkVal,
  typeFromData, VSOp, unOpPrec, powerPrec, unExpr, unExpr', unExprNumDbl,
  typeUnExpr, binExpr, binExprNumDbl', typeBinExpr, typeFromData)
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, 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 Drasil.Shared.LanguageRenderer.LanguagePolymorphic (docFuncRepr)
import qualified Drasil.Shared.LanguageRenderer.CommonPseudoOO as CP
import qualified Drasil.Shared.LanguageRenderer.CLike as C (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, multiAssignError, multiReturnError, multiTypeError, setType)
import qualified Drasil.Shared.LanguageRenderer.Macros as M (ifExists,
  runStrategy, listSlice, stringListVals, stringListLists, forRange,
  notifyObservers)
import qualified Drasil.GOOL.LanguageRenderer.CommonGOOL as CG (classMethodCall,
  listAppend, listAdd, innerType)
import Drasil.Shared.AST (Terminator(..), VisibilityTag(..), qualName,
  FileType(..), fileD, FuncData(..), fd, ModData(..), md, updateMod,
  MethodData(..), mthd, updateMthd, OpData(..), ParamData(..), pd, ProgData(..),
  progD, TypeData(..), ValData(..), vd, VarData(..), vard, ScopeData,
  BinderD(..), bindFormD, FileData, Statement)
import Drasil.Shared.CodeAnalysis (Exception(..), ExceptionType(..), exception,
  stdExc, HasException(..))
import Drasil.Shared.Helpers (emptyIfNull, toCode, toState, onCodeValue,
  onStateValue, on2CodeValues, on2StateValues, on3CodeValues, on3StateValues,
  onCodeList, onStateList, on2StateWrapped)
import Drasil.Shared.State (CS, MS, VS, lensGStoFS, lensMStoFS, lensMStoVS,
  lensVStoFS, lensVStoMS, modifyReturn, modifyReturnList, revFiles,
  addProgNameToPaths, addLangImport, addLangImportVS, addExceptionImports,
  getModuleName, setFileType, getClassName, setCurrMain, setOutputsDeclared,
  isOutputsDeclared, getExceptions, getMethodExcMap, addExceptions, useVarName,
  setVarScope)

import Prelude hiding (break,print,sin,cos,tan,floor,(<>))
import qualified Prelude as P ((<>))
import Control.Lens.Zoom (zoom)
import Control.Monad (join)
import Control.Monad.State (modify)
import Data.Composition ((.:))
import qualified Data.Map as Map (lookup)
import Data.List (nub, intercalate, sort)
import Text.PrettyPrint.HughesPJ (Doc, text, (<>), (<+>), ($$), parens, empty,
  equals, vcat, lbrace, rbrace, braces, colon, quotes)

import qualified Drasil.Shared.LanguageRenderer.Common as CS

jExt :: String
jExt :: String
jExt = String
"java"

newtype JavaCode a = JC {forall a. JavaCode a -> a
unJC :: a}

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

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

instance Monad JavaCode where
  JC a
x >>= :: forall a b. JavaCode a -> (a -> JavaCode b) -> JavaCode b
>>= a -> JavaCode b
f = a -> JavaCode b
f a
x

instance OOProg JavaCode ProgData FileData ModData Class StateVar MethodData Doc Doc ParamData Body Block Statement Variable ScopeData Value BinderD TypeData

instance ProgramSym JavaCode ProgData FileData where
  prog :: String
-> String
-> [FS (JavaCode FileData)]
-> GSProgram JavaCode ProgData
prog String
n String
st [FS (JavaCode FileData)]
fs = [State GOOLState (JavaCode FileData)]
-> (GOOLState -> GOOLState)
-> ([JavaCode FileData] -> JavaCode ProgData)
-> GSProgram JavaCode ProgData
forall s b a. [State s b] -> (s -> s) -> ([b] -> a) -> State s a
modifyReturnList (LensLike'
  (Zoomed (StateT FileState Identity) (JavaCode FileData))
  GOOLState
  FileState
-> FS (JavaCode FileData) -> State GOOLState (JavaCode FileData)
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) (JavaCode FileData))
  GOOLState
  FileState
(FileState -> Focusing Identity (JavaCode FileData) FileState)
-> GOOLState -> Focusing Identity (JavaCode FileData) GOOLState
Lens' GOOLState FileState
lensGStoFS (FS (JavaCode FileData) -> State GOOLState (JavaCode FileData))
-> [FS (JavaCode FileData)]
-> [State GOOLState (JavaCode FileData)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [FS (JavaCode FileData)]
fs) (GOOLState -> GOOLState
revFiles (GOOLState -> GOOLState)
-> (GOOLState -> GOOLState) -> GOOLState -> GOOLState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    String -> GOOLState -> GOOLState
addProgNameToPaths String
n) (([FileData] -> ProgData)
-> [JavaCode FileData] -> JavaCode ProgData
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList (String -> String -> [FileData] -> ProgData
progD String
n String
st ([FileData] -> ProgData)
-> ([FileData] -> [FileData]) -> [FileData] -> ProgData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FileData -> FileData) -> [FileData] -> [FileData]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> Doc -> FileData -> FileData
R.package String
n
    Doc
endStatement)))

instance CommonRenderSym JavaCode MethodData Doc ParamData Body Block Statement Variable ScopeData Value BinderD TypeData
instance OORenderSym JavaCode FileData ModData Class StateVar MethodData Doc Doc ParamData Body Block Statement Variable ScopeData Value BinderD TypeData

instance UnRepr JavaCode contents where
  unRepr :: JavaCode contents -> contents
unRepr = JavaCode contents -> contents
forall a. JavaCode a -> a
unJC

instance FileSym JavaCode FileData ModData where
  fileDoc :: FS (JavaCode ModData) -> FS (JavaCode FileData)
fileDoc FS (JavaCode ModData)
m = do
    (FileState -> FileState) -> StateT FileState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (FileType -> FileState -> FileState
setFileType FileType
Combined)
    String
-> (JavaCode ModData -> JavaCode Doc)
-> JavaCode Doc
-> FS (JavaCode ModData)
-> FS (JavaCode FileData)
forall (r :: * -> *) block mod file.
(BlockElim r block, RenderMod r mod, RenderFile r file mod) =>
String
-> (r mod -> r block) -> r block -> FS (r mod) -> FS (r file)
G.fileDoc String
jExt JavaCode ModData -> JavaCode Doc
forall (r :: * -> *) file mod.
RenderFile r file mod =>
r mod -> r Doc
top JavaCode Doc
forall (r :: * -> *) file mod. RenderFile r file mod => r Doc
bottom FS (JavaCode ModData)
m

  docMod :: String
-> String
-> [String]
-> String
-> FS (JavaCode FileData)
-> FS (JavaCode FileData)
docMod = String
-> String
-> String
-> [String]
-> String
-> FS (JavaCode FileData)
-> FS (JavaCode FileData)
forall (r :: * -> *) file mod.
(BlockCommentSym r, RenderFile r file mod) =>
String
-> String
-> String
-> [String]
-> String
-> FS (r file)
-> FS (r file)
CP.doxMod String
jExt

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

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

  fileFromData :: String -> FS (JavaCode ModData) -> FS (JavaCode FileData)
fileFromData = (String -> JavaCode ModData -> JavaCode FileData)
-> String -> FS (JavaCode ModData) -> FS (JavaCode FileData)
forall {k} (r :: k -> *) (mod :: k) (file :: k).
ModuleElim r mod =>
(String -> r mod -> r file) -> String -> FS (r mod) -> FS (r file)
G.fileFromData ((ModData -> FileData) -> JavaCode ModData -> JavaCode FileData
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
onCodeValue ((ModData -> FileData) -> JavaCode ModData -> JavaCode FileData)
-> (String -> ModData -> FileData)
-> String
-> JavaCode ModData
-> JavaCode FileData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ModData -> FileData
fileD)

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

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

instance PermElim JavaCode Doc where
  perm :: JavaCode Doc -> Doc
perm = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC
  binding :: JavaCode Doc -> AttachmentTag
binding = String -> JavaCode Doc -> AttachmentTag
forall a. HasCallStack => String -> a
error (String -> JavaCode Doc -> AttachmentTag)
-> String -> JavaCode Doc -> AttachmentTag
forall a b. (a -> b) -> a -> b
$ String -> String
CP.bindingError String
jName

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

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

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

instance BodyElim JavaCode Body where
  body :: JavaCode Doc -> Doc
body = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance BlockSym JavaCode Block Statement where
  block :: [MS (JavaCode Statement)] -> MS (JavaCode Doc)
block = [MS (JavaCode Statement)] -> MS (JavaCode Doc)
forall (r :: * -> *) stmt.
(Monad r, RenderStatement r stmt, StatementElim r stmt) =>
[MS (r stmt)] -> MS (r Doc)
G.block

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

instance BlockElim JavaCode Block where
  block :: JavaCode Doc -> Doc
block = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance TypeSym JavaCode TypeData where
  bool :: VS (JavaCode TypeData)
bool = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jBoolType
  int :: VS (JavaCode TypeData)
int = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.int
  float :: VS (JavaCode TypeData)
float = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.float
  double :: VS (JavaCode TypeData)
double = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.double
  char :: VS (JavaCode TypeData)
char = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.char
  string :: VS (JavaCode TypeData)
string = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.string'
  infile :: VS (JavaCode TypeData)
infile = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jInfileType
  outfile :: VS (JavaCode TypeData)
outfile = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
jOutfileType
  referenceType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
referenceType = VS (JavaCode TypeData) -> VS (JavaCode 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 (JavaCode TypeData) -> VS (JavaCode TypeData)
listType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r TypeData, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jListType
  setType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
setType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r TypeData, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jSetType
  arrayType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
arrayType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(TypeElim r TypeData, Monad r, UnRepr r TypeData) =>
VS (r TypeData) -> VS (r TypeData)
CP.arrayType
  innerType :: VS (JavaCode TypeData) -> VS (JavaCode TypeData)
innerType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
(TypeElim r typ, TypeSym r typ, OOTypeSym r typ) =>
VS (r typ) -> VS (r typ)
CG.innerType
  funcType :: [VS (JavaCode TypeData)]
-> VS (JavaCode TypeData) -> VS (JavaCode TypeData)
funcType = [VS (JavaCode TypeData)]
-> VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData) =>
[VS (r TypeData)] -> VS (r TypeData) -> VS (r TypeData)
CS.funcType -- TODO [Brandon Bosman, 05/11/2026]: fix this to work with lambda types
  void :: VS (JavaCode TypeData)
void = VS (JavaCode TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
C.void

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

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

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

instance UnaryOpSym JavaCode where
  notOp :: VSUnOp JavaCode
notOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
C.notOp
  negateOp :: VSUnOp JavaCode
negateOp = VSUnOp JavaCode
forall (r :: * -> *). Monad r => VSOp r
G.negateOp
  sqrtOp :: VSUnOp JavaCode
sqrtOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.sqrt
  absOp :: VSUnOp JavaCode
absOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.abs
  logOp :: VSUnOp JavaCode
logOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.log10
  lnOp :: VSUnOp JavaCode
lnOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.log
  expOp :: VSUnOp JavaCode
expOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.exp
  sinOp :: VSUnOp JavaCode
sinOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.sin
  cosOp :: VSUnOp JavaCode
cosOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.cos
  tanOp :: VSUnOp JavaCode
tanOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.tan
  asinOp :: VSUnOp JavaCode
asinOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.asin
  acosOp :: VSUnOp JavaCode
acosOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.acos
  atanOp :: VSUnOp JavaCode
atanOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.atan
  floorOp :: VSUnOp JavaCode
floorOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.floor
  ceilOp :: VSUnOp JavaCode
ceilOp = String -> VSUnOp JavaCode
forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath String
R.ceil

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

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

instance ScopeSym JavaCode ScopeData where
  global :: JavaCode ScopeData
global = JavaCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
CP.global
  mainFn :: JavaCode ScopeData
mainFn = JavaCode ScopeData
forall {k} (r :: k -> *) (scope :: k). ScopeSym r scope => r scope
local
  local :: JavaCode ScopeData
local = JavaCode ScopeData
forall (r :: * -> *). Monad r => r ScopeData
G.local

instance ScopeElim JavaCode ScopeData where
  scopeData :: JavaCode ScopeData -> ScopeData
scopeData = JavaCode ScopeData -> ScopeData
forall a. JavaCode a -> a
unJC

instance VariableSym JavaCode Variable TypeData where
  var :: String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
var         = String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
RenderVariable r var typ =>
String -> VS (r typ) -> VS (r var)
G.var
  constant :: String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
constant    = String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableSym r var typ =>
String -> VS (r typ) -> VS (r var)
var
  extVar :: String
-> String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
extVar      = String
-> String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
RenderVariable r var typ =>
String -> String -> VS (r typ) -> VS (r var)
CS.extVar

instance OOVariableSym JavaCode Variable Value TypeData where
  classVar :: String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
classVar = String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
RenderVariable r var typ =>
String -> VS (r typ) -> VS (r var)
G.classVar
  classConst :: String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
classConst = String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOVariableSym r var val typ =>
String -> VS (r typ) -> VS (r var)
classVar
  classVarAccess :: VS (JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
classVarAccess = (Doc -> Doc -> Doc)
-> VS (JavaCode TypeData)
-> VS (JavaCode Variable)
-> VS (JavaCode Variable)
forall (r :: * -> *) var.
(InternalVarElim r var, RenderVariable r var TypeData,
 UnRepr r TypeData, VariableElim r var TypeData) =>
(Doc -> Doc -> Doc) -> VS (r TypeData) -> VS (r var) -> VS (r var)
CP.classVarAccess Doc -> Doc -> Doc
R.classVarAccess
  extClassVarAccess :: VS (JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
extClassVarAccess = VS (JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOVariableSym r var val typ =>
VS (r typ) -> VS (r var) -> VS (r var)
classVarAccess
  instanceVarAccess :: VS (JavaCode Value)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
instanceVarAccess = VS (JavaCode Value)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k) (val :: k).
(InternalVarElim r var, RenderVariable r var typ, ValueElim r val,
 VariableElim r var typ) =>
VS (r val) -> VS (r var) -> VS (r var)
G.instanceVarAccess

instance SelfSym JavaCode Variable where
  self :: VS (JavaCode Variable)
self = VS (JavaCode Variable)
forall {k} (r :: k -> *) (typ :: k) (var :: k).
(OOTypeSym r typ, RenderVariable r var typ) =>
VS (r var)
C.self

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

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

instance RenderVariable JavaCode Variable TypeData where
  varFromData :: AttachmentTag
-> String
-> VS (JavaCode TypeData)
-> Doc
-> VS (JavaCode Variable)
varFromData AttachmentTag
b String
n VS (JavaCode TypeData)
t' Doc
d =  do
    t <- VS (JavaCode TypeData)
t'
    toState $ on2CodeValues (vard b n) t (toCode d)

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

instance Argument JavaCode Value where
  pointerArg :: VS (JavaCode Value) -> VS (JavaCode Value)
pointerArg = VS (JavaCode Value) -> VS (JavaCode Value)
forall a. a -> a
id

instance Literal JavaCode Value TypeData where
  litTrue :: VS (JavaCode Value)
litTrue = VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
VS (r val)
C.litTrue
  litFalse :: VS (JavaCode Value)
litFalse = VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
VS (r val)
C.litFalse
  litChar :: Char -> VS (JavaCode Value)
litChar = (Doc -> Doc) -> Char -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
(Doc -> Doc) -> Char -> VS (r val)
G.litChar Doc -> Doc
quotes
  litDouble :: Double -> VS (JavaCode Value)
litDouble = Double -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
Double -> VS (r val)
G.litDouble
  litFloat :: Float -> VS (JavaCode Value)
litFloat = Float -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
Float -> VS (r val)
C.litFloat
  litInt :: Integer -> VS (JavaCode Value)
litInt = Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
Integer -> VS (r val)
G.litInt
  litString :: String -> VS (JavaCode Value)
litString = String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
String -> VS (r val)
G.litString
  litArray :: VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
litArray = VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
jLitArray
  litSet :: VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
litSet = (Doc -> Doc)
-> (Doc -> Doc)
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ, ValueElim r val) =>
(Doc -> Doc)
-> (Doc -> Doc) -> VS (r typ) -> [VS (r val)] -> VS (r val)
CP.litSet (String -> Doc
text String
jSetOf Doc -> Doc -> Doc
<>) Doc -> Doc
parens

  litList :: VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
litList VS (JavaCode TypeData)
t [VS (JavaCode Value)]
es = do
    LensLike'
  (Zoomed (StateT MethodState Identity) ()) ValueState MethodState
-> StateT MethodState Identity () -> StateT ValueState Identity ()
forall c.
LensLike'
  (Zoomed (StateT MethodState Identity) c) ValueState MethodState
-> StateT MethodState Identity c -> StateT ValueState 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 MethodState Identity) ()) ValueState MethodState
Lens' ValueState MethodState
lensVStoMS (StateT MethodState Identity () -> StateT ValueState Identity ())
-> StateT MethodState Identity () -> StateT ValueState Identity ()
forall a b. (a -> b) -> a -> b
$ (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (if [VS (JavaCode Value)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [VS (JavaCode Value)]
es then MethodState -> MethodState
forall a. a -> a
id else String -> MethodState -> MethodState
addLangImport (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport
      String
jArrays)
    VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj (VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
TypeSym r typ =>
VS (r typ) -> VS (r typ)
listType VS (JavaCode TypeData)
t) [VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
jAsListFunc VS (JavaCode TypeData)
t [VS (JavaCode Value)]
es | Bool -> Bool
not ([VS (JavaCode Value)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [VS (JavaCode Value)]
es)]

instance MathConstant JavaCode Value where
  pi :: VS (JavaCode Value)
pi = VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
VS (r val)
CP.pi

instance VariableValue JavaCode Variable Value where
  valueOf :: VS (JavaCode Variable) -> VS (JavaCode Value)
valueOf = VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(InternalVarElim r var, RenderValue r var val typ,
 VariableElim r var typ) =>
VS (r var) -> VS (r val)
G.valueOf

instance CommandLineArgs JavaCode Value where
  arg :: Integer -> VS (JavaCode Value)
arg Integer
n = VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ, ValueElim r val) =>
VS (r val) -> VS (r val) -> VS (r val)
G.arg (Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
n) VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k).
CommandLineArgs r val =>
VS (r val)
argsList
  argsList :: VS (JavaCode Value)
argsList = String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, TypeSym r typ) =>
String -> VS (r val)
G.argsList String
args
  argExists :: Integer -> VS (JavaCode Value)
argExists Integer
i = VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k).
List r val =>
VS (r val) -> VS (r val)
listSize VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k).
CommandLineArgs r val =>
VS (r val)
argsList VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k).
Comparison r val =>
VS (r val) -> VS (r val) -> VS (r val)
?> Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt (Integer -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i)

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

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

instance BooleanExpression JavaCode Value where
  ?! :: VS (JavaCode Value) -> VS (JavaCode Value)
(?!) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSUnOp r -> VS (r typ) -> VS (r val) -> VS (r val)
typeUnExpr VSUnOp JavaCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
notOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?&& :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?&&) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
andOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?|| :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?||) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
orOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool

instance Comparison JavaCode Value where
  ?< :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?<) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?<= :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?<=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessEqualOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?> :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?>) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?>= :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?>=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterEqualOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool
  ?== :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?==) = VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
jEquality
  ?!= :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
(?!=) = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
notEqualOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool

instance ValueExpression JavaCode Variable Value BinderD TypeData where
  inlineIf :: VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
inlineIf = VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(RenderValue r var val typ, ValueElim r val, ValueSym r val typ) =>
VS (r val) -> VS (r val) -> VS (r val) -> VS (r val)
C.inlineIf

  -- Exceptions from function/method calls should already be in the exception
  -- map from the CodeInfo pass, but it's possible that one of the higher-level
  -- functions implicitly calls these functions in the Java renderer, so we
  -- also check here to add the exceptions from the called function to the map
  funcAppMixedArgs :: MixedCall JavaCode Variable Value TypeData
funcAppMixedArgs String
n VS (JavaCode TypeData)
t [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns = do
    String -> StateT ValueState Identity ()
addCallExcsCurrMod String
n
    MixedCall JavaCode Variable Value TypeData
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
MixedCall r var val typ
G.funcAppMixedArgs String
n VS (JavaCode TypeData)
t [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns
  extFuncAppMixedArgs :: String -> MixedCall JavaCode Variable Value TypeData
extFuncAppMixedArgs String
l String
n VS (JavaCode TypeData)
t [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns = do
    mem <- VS (Map QualifiedName [ExceptionType])
getMethodExcMap
    modify (maybe id addExceptions (Map.lookup (qualName l n) mem))
    CS.extFuncAppMixedArgs l n t vs ns
  libFuncAppMixedArgs :: String -> MixedCall JavaCode Variable Value TypeData
libFuncAppMixedArgs = String -> MixedCall JavaCode Variable Value TypeData
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
String -> MixedCall r var val typ
C.libFuncAppMixedArgs

  lambda :: [VS (JavaCode BinderD)]
-> VS (JavaCode Value) -> VS (JavaCode Value)
lambda = ([JavaCode BinderD] -> JavaCode Value -> Doc)
-> [VS (JavaCode BinderD)]
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (binder :: k) (typ :: k) (var :: k)
       (val :: k).
(BinderElim r binder typ, RenderValue r var val typ, TypeSym r typ,
 ValueSym r val typ) =>
([r binder] -> r val -> Doc)
-> [VS (r binder)] -> VS (r val) -> VS (r val)
G.lambda [JavaCode BinderD] -> JavaCode Value -> Doc
forall (r :: * -> *). [r BinderD] -> r Value -> Doc
jLambda

  notNull :: VS (JavaCode Value) -> VS (JavaCode Value)
notNull = String -> VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k) (var :: k).
(ValueSym r val typ, Comparison r val, VariableSym r var typ,
 VariableValue r var val) =>
String -> VS (r val) -> VS (r val)
CP.notNull String
nullLabel

instance OOValueExpression JavaCode Variable Value TypeData where
  newObjMixedArgs :: MixedCtorCall JavaCode Variable Value TypeData
newObjMixedArgs VS (JavaCode TypeData)
ot [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns = VS (JavaCode TypeData)
-> (VS (JavaCode TypeData) -> VS (JavaCode Value))
-> VS (JavaCode Value)
forall (r :: * -> *).
UnRepr r TypeData =>
VS (r TypeData)
-> (VS (r TypeData) -> VS (r Value)) -> VS (r Value)
addConstructorCallExcsCurrMod VS (JavaCode TypeData)
ot (\VS (JavaCode TypeData)
t ->
    MixedCall JavaCode Variable Value TypeData
forall (r :: * -> *) var val.
(RenderValue r var val TypeData, UnRepr r TypeData) =>
String -> MixedCtorCall r var val TypeData
G.newObjMixedArgs (String
new String -> String -> String
forall a. Semigroup a => a -> a -> a
P.<> String
" ") VS (JavaCode TypeData)
t [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns)
  extNewObjMixedArgs :: MixedCall JavaCode Variable Value TypeData
extNewObjMixedArgs String
l VS (JavaCode TypeData)
ot [VS (JavaCode Value)]
vs NamedArgs JavaCode Variable Value
ns = do
    t <- VS (JavaCode TypeData)
ot
    mem <- getMethodExcMap
    let tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString JavaCode TypeData
t
    modify (maybe id addExceptions (Map.lookup (qualName l tp) mem))
    newObjMixedArgs (toState t) vs ns
  libNewObjMixedArgs :: MixedCall JavaCode Variable Value TypeData
libNewObjMixedArgs = MixedCall JavaCode Variable Value TypeData
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
String -> MixedCtorCall r var val typ
C.libNewObjMixedArgs

instance RenderValue JavaCode Variable Value TypeData where
  inputFunc :: VS (JavaCode Value)
inputFunc = (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jScanner) StateT ValueState Identity ()
-> VS (JavaCode Value) -> VS (JavaCode Value)
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
>> VS (JavaCode TypeData) -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r typ) -> Doc -> VS (r val)
mkStateVal
    (String -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
OOTypeSym r typ =>
String -> VS (r typ)
obj String
jScanner) (Doc -> Doc
parens (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ Doc
new' Doc -> Doc -> Doc
<+> Doc
jScanner' Doc -> Doc -> Doc
<> Doc -> Doc
parens (String -> Doc
jSystem String
jStdIn))
  printFunc :: VS (JavaCode Value)
printFunc = VS (JavaCode TypeData) -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r typ) -> Doc -> VS (r val)
mkStateVal VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void (String -> Doc
jSystem (String
jStdOut String -> String -> String
`access` String
printLabel))
  printLnFunc :: VS (JavaCode Value)
printLnFunc = VS (JavaCode TypeData) -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r typ) -> Doc -> VS (r val)
mkStateVal VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void (String -> Doc
jSystem (String
jStdOut String -> String -> String
`access` String
jPrintLn))
  printFileFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
printFileFunc = (JavaCode TypeData -> JavaCode Value -> VS (JavaCode Value))
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\JavaCode TypeData
v -> JavaCode TypeData -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
r typ -> Doc -> VS (r val)
mkVal JavaCode TypeData
v (Doc -> VS (JavaCode Value))
-> (JavaCode Value -> Doc) -> JavaCode Value -> VS (JavaCode Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
printLabel (Doc -> Doc) -> (JavaCode Value -> Doc) -> JavaCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    JavaCode Value -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value) VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void
  printFileLnFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
printFileLnFunc = (JavaCode TypeData -> JavaCode Value -> VS (JavaCode Value))
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> m a -> m b -> m c
on2StateWrapped (\JavaCode TypeData
v -> JavaCode TypeData -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
r typ -> Doc -> VS (r val)
mkVal JavaCode TypeData
v (Doc -> VS (JavaCode Value))
-> (JavaCode Value -> Doc) -> JavaCode Value -> VS (JavaCode Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> Doc
R.printFile String
jPrintLn (Doc -> Doc) -> (JavaCode Value -> Doc) -> JavaCode Value -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    JavaCode Value -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value) VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void

  cast :: VS (JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode Value)
cast = VS (JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode Value)
jCast

  call :: Maybe String
-> Maybe Doc -> MixedCall JavaCode Variable Value TypeData
call = String
-> Maybe String
-> Maybe Doc
-> MixedCall JavaCode Variable Value TypeData
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(InternalVarElim r var, RenderValue r var val typ,
 ValueElim r val) =>
String -> Maybe String -> Maybe Doc -> MixedCall r var val typ
CP.call' String
jName

  valFromData :: Maybe Int
-> Maybe Integer
-> VS (JavaCode TypeData)
-> Doc
-> VS (JavaCode Value)
valFromData Maybe Int
p Maybe Integer
i VS (JavaCode TypeData)
t' Doc
d = do
    t <- VS (JavaCode TypeData)
t'
    toState $ on2CodeValues (vd p i) t (toCode d)

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

instance InternalValueExp JavaCode Variable Value TypeData where
  objMethodCallMixedArgs' :: String
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> [VS (JavaCode Value)]
-> NamedArgs JavaCode Variable Value
-> VS (JavaCode Value)
objMethodCallMixedArgs' String
f VS (JavaCode TypeData)
t VS (JavaCode Value)
o [VS (JavaCode Value)]
ps NamedArgs JavaCode Variable Value
ns = do
    ob <- VS (JavaCode Value)
o
    mem <- getMethodExcMap
    let tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString (JavaCode Value -> JavaCode TypeData
forall {k} (r :: k -> *) (val :: k) (typ :: k).
ValueSym r val typ =>
r val -> r typ
valueType JavaCode Value
ob)
    modify (maybe id addExceptions (Map.lookup (qualName tp f) mem))
    G.objMethodCall f t o ps ns
  classMethodCallMixedArgs' :: String
-> VS (JavaCode TypeData)
-> MixedCtorCall JavaCode Variable Value TypeData
classMethodCallMixedArgs' String
f VS (JavaCode TypeData)
t VS (JavaCode TypeData)
c [VS (JavaCode Value)]
ps NamedArgs JavaCode Variable Value
ns = do
    cls <- VS (JavaCode TypeData)
c
    mem <- getMethodExcMap
    let tp = JavaCode TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString JavaCode TypeData
cls
    modify (maybe id addExceptions (Map.lookup (qualName tp f) mem))
    CG.classMethodCall f t c ps ns

instance OOFunctionSym JavaCode Value TypeData where
  func :: String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
func = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) typ val var binder.
(RenderFunction r typ, ValueElim r val,
 ValueExpression r var val binder typ) =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
G.func
  objAccess :: VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
objAccess = VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) typ var val.
(FunctionElim r typ, RenderValue r var val typ, ValueElim r val) =>
VS (r val) -> VS (r FuncData) -> VS (r val)
G.objAccess

instance GetSet JavaCode Variable Value where
  get :: VS (JavaCode Value)
-> VS (JavaCode Variable) -> VS (JavaCode Value)
get = VS (JavaCode Value)
-> VS (JavaCode Variable) -> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(InternalGetSet r var val typ, OOFunctionSym r val typ) =>
VS (r val) -> VS (r var) -> VS (r val)
G.get
  set :: VS (JavaCode Value)
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
set = VS (JavaCode Value)
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) val typ var.
(ValueSym r val typ, InternalGetSet r var val typ,
 OOFunctionSym r val typ) =>
VS (r val) -> VS (r var) -> VS (r val) -> VS (r val)
G.set

instance IndexTranslator JavaCode Value where
  intToIndex :: VS (JavaCode Value) -> VS (JavaCode Value)
intToIndex = VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k). VS (r val) -> VS (r val)
CP.intToIndex
  indexToInt :: VS (JavaCode Value) -> VS (JavaCode Value)
indexToInt = VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k). VS (r val) -> VS (r val)
CP.indexToInt

instance Reference JavaCode Value where
  makeRef :: VS (JavaCode Value) -> VS (JavaCode Value)
makeRef = VS (JavaCode Value) -> VS (JavaCode Value)
forall a. a -> a
id
  maybeDeref :: VS (JavaCode Value) -> VS (JavaCode Value)
maybeDeref = VS (JavaCode Value) -> VS (JavaCode Value)
forall a. a -> a
id

instance Array JavaCode Variable Value where
  arrayElem :: VS (JavaCode Value)
-> VS (JavaCode Value) -> VS (JavaCode Variable)
arrayElem = VS (JavaCode Value)
-> VS (JavaCode Value) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (typ :: k) (val :: k) (var :: k).
(TypeSym r typ, ValueSym r val typ, IndexTranslator r val,
 RenderVariable r var typ, ValueElim r val) =>
VS (r val) -> VS (r val) -> VS (r var)
G.arrayElem
  arrayLength :: VS (JavaCode Value) -> VS (JavaCode Value)
arrayLength VS (JavaCode Value)
arr = VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf (VS (JavaCode Variable) -> VS (JavaCode Value))
-> VS (JavaCode Variable) -> VS (JavaCode Value)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
-> VS (JavaCode Variable) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOVariableSym r var val typ =>
VS (r val) -> VS (r var) -> VS (r var)
instanceVarAccess VS (JavaCode Value)
arr (String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableSym r var typ =>
String -> VS (r typ) -> VS (r var)
var String
"length" VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
int)
  arrayCopy :: VS (JavaCode Value) -> VS (JavaCode Value)
arrayCopy VS (JavaCode Value)
arr = let
    arrTp :: VS (JavaCode TypeData)
arrTp = (JavaCode Value -> JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Value -> JavaCode TypeData
forall {k} (r :: k -> *) (val :: k) (typ :: k).
ValueSym r val typ =>
r val -> r typ
valueType VS (JavaCode Value)
arr
    in VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> String
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
InternalValueExp r var val typ =>
VS (r typ) -> VS (r val) -> String -> [VS (r val)] -> VS (r val)
objMethodCall VS (JavaCode TypeData)
arrTp VS (JavaCode Value)
arr String
"clone" []

instance List JavaCode Value where
  listSize :: VS (JavaCode Value) -> VS (JavaCode Value)
listSize = String -> VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(TypeSym r typ, InternalValueExp r var val typ) =>
String -> VS (r val) -> VS (r val)
C.listSize String
"size"
  listAccess :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
listAccess = VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
forall (r :: * -> *) typ val var.
(TypeSym r typ, ValueSym r val typ, IndexTranslator r val,
 InternalListFunc r val typ, FunctionElim r typ,
 RenderFunction r typ, RenderValue r var val typ, TypeElim r typ,
 ValueElim r val) =>
VS (r val) -> VS (r val) -> VS (r val)
G.listAccess
  indexOf :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
indexOf = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) typ val.
(TypeSym r typ, IndexTranslator r val, OOFunctionSym r val typ) =>
String -> VS (r val) -> VS (r val) -> VS (r val)
CP.indexOf String
jIndex

instance ListStatement JavaCode Statement Value where
  listAdd :: VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
listAdd = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (typ :: k) (val :: k) (var :: k)
       (stmt :: k).
(TypeSym r typ, IndexTranslator r val,
 InternalValueExp r var val typ, ValueStatement r stmt val) =>
String -> VS (r val) -> VS (r val) -> VS (r val) -> MS (r stmt)
CG.listAdd String
jListAdd
  listAppend :: VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
listAppend = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k)
       (stmt :: k).
(TypeSym r typ, InternalValueExp r var val typ,
 ValueStatement r stmt val) =>
String -> VS (r val) -> VS (r val) -> MS (r stmt)
CG.listAppend String
jListAdd
  listSet :: VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
listSet VS (JavaCode Value)
list VS (JavaCode Value)
idx VS (JavaCode Value)
vl = VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
ValueStatement r stmt val =>
VS (r val) -> MS (r stmt)
valStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> String
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
InternalValueExp r var val typ =>
VS (r typ) -> VS (r val) -> String -> [VS (r val)] -> VS (r val)
objMethodCall VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void VS (JavaCode Value)
list String
jListSet [VS (JavaCode Value)
idx, VS (JavaCode Value)
vl]

instance Set JavaCode Value where
  contains :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
contains = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) typ val.
(TypeSym r typ, OOFunctionSym r val typ) =>
String -> VS (r val) -> VS (r val) -> VS (r val)
CP.contains String
jContains
  setAdd :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
setAdd = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (val :: k) (var :: k).
(TypeSym r typ, ValueSym r val typ,
 InternalValueExp r var val typ) =>
String -> VS (r val) -> VS (r val) -> VS (r val)
CP.setMethodCall String
jListAdd
  setRemove :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
setRemove = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (val :: k) (var :: k).
(TypeSym r typ, ValueSym r val typ,
 InternalValueExp r var val typ) =>
String -> VS (r val) -> VS (r val) -> VS (r val)
CP.setMethodCall String
jListRemove
  setUnion :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
setUnion = String
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (val :: k) (var :: k).
(TypeSym r typ, ValueSym r val typ,
 InternalValueExp r var val typ) =>
String -> VS (r val) -> VS (r val) -> VS (r val)
CP.setMethodCall String
jListUnion

instance InternalList JavaCode Block Variable Value where
  listSlice' :: Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
listSlice' = Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
forall (r :: * -> *) bod block stmt var val typ binder.
(BodySym r bod block, BlockSym r block stmt, EmptyStatement r stmt,
 ScopeSym r ScopeData, DeclStatement r bod stmt var ScopeData val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, TypeSym r typ,
 Literal r val typ, BooleanExpression r val, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val,
 IndexTranslator r val, List r val, ListStatement r stmt val,
 ValueElim r val, VariableElim r var typ) =>
Maybe (VS (r val))
-> Maybe (VS (r val))
-> Maybe (VS (r val))
-> VS (r var)
-> VS (r val)
-> MS (r block)
M.listSlice

instance InternalGetSet JavaCode Variable Value TypeData where
  getFunc :: VS (JavaCode Variable) -> VS (JavaCode FuncData)
getFunc = VS (JavaCode Variable) -> VS (JavaCode FuncData)
forall (r :: * -> *) val typ var.
(OOFunctionSym r val typ, VariableElim r var typ) =>
VS (r var) -> VS (r FuncData)
G.getFunc
  setFunc :: VS (JavaCode TypeData)
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode FuncData)
setFunc = VS (JavaCode TypeData)
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ var.
(OOFunctionSym r val typ, VariableElim r var typ) =>
VS (r typ) -> VS (r var) -> VS (r val) -> VS (r FuncData)
G.setFunc

instance InternalListFunc JavaCode Value TypeData where
  listAccessFunc :: VS (JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode FuncData)
listAccessFunc = String
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
(ValueSym r val typ, OOFunctionSym r val typ, TypeElim r typ) =>
String -> VS (r typ) -> VS (r val) -> VS (r FuncData)
CP.listAccessFunc' String
jListAccess

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

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

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

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

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

instance InternalAssignStmt JavaCode Statement Variable Value where
  multiAssign :: [VS (JavaCode Variable)]
-> [VS (JavaCode Value)] -> MS (JavaCode Statement)
multiAssign [VS (JavaCode Variable)]
_ [VS (JavaCode Value)]
_ = String -> MS (JavaCode Statement)
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode Statement))
-> String -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiAssignError String
jName

instance InternalIOStmt JavaCode Statement Value where
  printSt :: Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
printSt Bool
_ Maybe (VS (JavaCode Value))
_ = VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
(RenderStatement r stmt, ValueElim r val) =>
VS (r val) -> VS (r val) -> MS (r stmt)
CP.printSt

instance InternalControlStmt JavaCode Statement Value where
  multiReturn :: [VS (JavaCode Value)] -> MS (JavaCode Statement)
multiReturn [VS (JavaCode Value)]
_ = String -> MS (JavaCode Statement)
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode Statement))
-> String -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String -> String
C.multiReturnError String
jName

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

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

instance EmptyStatement JavaCode Statement where
  emptyStmt :: MS (JavaCode Statement)
emptyStmt = MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
RenderStatement r stmt =>
MS (r stmt)
G.emptyStmt

instance MultiStatement JavaCode Statement where
  multi :: [MS (JavaCode Statement)] -> MS (JavaCode Statement)
multi = ([JavaCode Statement] -> JavaCode Statement)
-> [MS (JavaCode Statement)] -> MS (JavaCode Statement)
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([Statement] -> Statement)
-> [JavaCode Statement] -> JavaCode Statement
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [Statement] -> Statement
R.multiStmt)

instance ValueStatement JavaCode Statement Value where
  valStmt :: VS (JavaCode Value) -> MS (JavaCode Statement)
valStmt = Terminator -> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
(RenderStatement r stmt, ValueElim r val) =>
Terminator -> VS (r val) -> MS (r stmt)
G.valStmt Terminator
Semi

instance AssignStatement JavaCode Statement Variable Value where
  assign :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
assign = Terminator
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (var :: k) (stmt :: k) (val :: k).
(InternalVarElim r var, RenderStatement r stmt, ValueElim r val) =>
Terminator -> VS (r var) -> VS (r val) -> MS (r stmt)
G.assign Terminator
Semi
  &-= :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
(&-=) = Terminator
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (var :: k) (stmt :: k) (val :: k).
(InternalVarElim r var, RenderStatement r stmt, ValueElim r val) =>
Terminator -> VS (r var) -> VS (r val) -> MS (r stmt)
G.subAssign Terminator
Semi
  &+= :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
(&+=) = VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (var :: k) (stmt :: k) (val :: k).
(InternalVarElim r var, RenderStatement r stmt, ValueElim r val) =>
VS (r var) -> VS (r val) -> MS (r stmt)
C.increment
  &++ :: VS (JavaCode Variable) -> MS (JavaCode Statement)
(&++) = VS (JavaCode Variable) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (var :: k) (stmt :: k).
(InternalVarElim r var, RenderStatement r stmt) =>
VS (r var) -> MS (r stmt)
C.increment1
  &-- :: VS (JavaCode Variable) -> MS (JavaCode Statement)
(&--) = VS (JavaCode Variable) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (var :: k) (stmt :: k).
(InternalVarElim r var, RenderStatement r stmt) =>
VS (r var) -> MS (r stmt)
C.decrement1

instance DeclStatement JavaCode Body Statement Variable ScopeData Value where
  varDec :: VS (JavaCode Variable)
-> JavaCode ScopeData -> MS (JavaCode Statement)
varDec = JavaCode Doc
-> JavaCode Doc
-> Doc
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
forall (r :: * -> *) var attch stmt.
(InternalVarElim r var, PermElim r attch, RenderStatement r stmt,
 ScopeElim r ScopeData, UnRepr r TypeData, TypeElim r TypeData,
 VariableElim r var TypeData) =>
r attch
-> r attch -> Doc -> VS (r var) -> r ScopeData -> MS (r stmt)
C.varDec JavaCode Doc
forall {k} (r :: k -> *) (attch :: k).
AttachmentSym r attch =>
r attch
classLevel JavaCode Doc
forall {k} (r :: k -> *) (attch :: k).
AttachmentSym r attch =>
r attch
instanceLevel Doc
empty
  varDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
varDecDef = Terminator
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
(DeclStatement r bod stmt var scope val, RenderStatement r stmt,
 StatementElim r stmt, ValueElim r val) =>
Terminator -> VS (r var) -> r scope -> VS (r val) -> MS (r stmt)
C.varDecDef Terminator
Semi
  setDec :: VS (JavaCode Variable)
-> JavaCode ScopeData -> MS (JavaCode Statement)
setDec = VS (JavaCode Variable)
-> JavaCode ScopeData -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> MS (r stmt)
varDec
  setDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
setDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> VS (r val) -> MS (r stmt)
varDecDef
  listDec :: Integer
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
listDec Integer
n VS (JavaCode Variable)
v JavaCode ScopeData
scp = LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> VS (JavaCode Variable)
-> StateT MethodState Identity (JavaCode 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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS VS (JavaCode Variable)
v StateT MethodState Identity (JavaCode Variable)
-> (JavaCode Variable -> MS (JavaCode Statement))
-> MS (JavaCode Statement)
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
>>= (\JavaCode Variable
v' -> (JavaCode Value -> Doc)
-> VS (JavaCode Value)
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
(DeclStatement r bod stmt var scope val, RenderStatement r stmt,
 StatementElim r stmt) =>
(r val -> Doc)
-> VS (r val) -> VS (r var) -> r scope -> MS (r stmt)
C.listDec (JavaCode Variable -> JavaCode Value -> Doc
forall (r :: * -> *) val var.
(UnRepr r TypeData, ValueElim r val,
 VariableElim r var TypeData) =>
r var -> r val -> Doc
renderListDec JavaCode Variable
v')
    (Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
n) VS (JavaCode Variable)
v JavaCode ScopeData
scp)
  listDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
listDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k) (typ :: k).
(DeclStatement r bod stmt var scope val, TypeSym r typ,
 Literal r val typ, VariableElim r var typ) =>
VS (r var) -> r scope -> [VS (r val)] -> MS (r stmt)
CP.listDecDef
  arrayDec :: Integer
-> VS (JavaCode Value)
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
arrayDec Integer
n VS (JavaCode Value)
_ = VS (JavaCode Value)
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
forall (r :: * -> *) var stmt val.
(TypeSym r TypeData, ScopeElim r ScopeData, UnRepr r TypeData,
 InternalVarElim r var, RenderStatement r stmt, ValueElim r val,
 VariableElim r var TypeData) =>
VS (r val) -> VS (r var) -> r ScopeData -> MS (r stmt)
CP.arrayDec (Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
n)
  arrayDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
arrayDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
(DeclStatement r bod stmt var scope val, RenderStatement r stmt,
 StatementElim r stmt, ValueElim r val) =>
VS (r var) -> r scope -> [VS (r val)] -> MS (r stmt)
CP.arrayDecDef
  constDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
constDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
jConstDecDef
  funcDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
funcDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
jFuncDecDef

instance OODeclStatement JavaCode Statement Variable ScopeData Value where
  objDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
objDecDef = VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> VS (r val) -> MS (r stmt)
varDecDef
  objDecNew :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
objDecNew = VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k) (typ :: k).
(DeclStatement r bod stmt var scope val,
 OOValueExpression r var val typ, VariableElim r var typ) =>
VS (r var) -> r scope -> [VS (r val)] -> MS (r stmt)
G.objDecNew
  extObjDecNew :: String
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
extObjDecNew = String
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Value)]
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k) (typ :: k).
(DeclStatement r bod stmt var scope val,
 OOValueExpression r var val typ, VariableElim r var typ) =>
String -> VS (r var) -> r scope -> [VS (r val)] -> MS (r stmt)
C.extObjDecNew

instance PrintConsole JavaCode Statement Value where
  print :: VS (JavaCode Value) -> MS (JavaCode Statement)
print      = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
False Maybe (VS (JavaCode Value))
forall a. Maybe a
Nothing VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
printFunc
  printLn :: VS (JavaCode Value) -> MS (JavaCode Statement)
printLn    = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
True  Maybe (VS (JavaCode Value))
forall a. Maybe a
Nothing VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
printLnFunc
  printStr :: String -> MS (JavaCode Statement)
printStr   = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
False Maybe (VS (JavaCode Value))
forall a. Maybe a
Nothing VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
printFunc   (VS (JavaCode Value) -> MS (JavaCode Statement))
-> (String -> VS (JavaCode Value))
-> String
-> MS (JavaCode Statement)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
String -> VS (r val)
litString
  printStrLn :: String -> MS (JavaCode Statement)
printStrLn = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
True  Maybe (VS (JavaCode Value))
forall a. Maybe a
Nothing VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
printLnFunc (VS (JavaCode Value) -> MS (JavaCode Statement))
-> (String -> VS (JavaCode Value))
-> String
-> MS (JavaCode Statement)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
String -> VS (r val)
litString

instance ReadConsole JavaCode Statement Variable where
  getInput :: VS (JavaCode Variable) -> MS (JavaCode Statement)
getInput VS (JavaCode Variable)
v = VS (JavaCode Variable)
v VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
&= VS (JavaCode Variable)
-> VS (JavaCode Value) -> VS (JavaCode Value)
jInput VS (JavaCode Variable)
v VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
inputFunc
  discardInput :: MS (JavaCode Statement)
discardInput = VS (JavaCode Value) -> MS (JavaCode Statement)
jDiscardInput VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val)
inputFunc

instance FileHandling JavaCode Statement Variable Value where
  openFileR :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
openFileR = (VS (JavaCode Value)
 -> VS (JavaCode TypeData) -> VS (JavaCode Value))
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (typ :: k) (stmt :: k) (var :: k)
       (val :: k).
(TypeSym r typ, AssignStatement r stmt var val) =>
(VS (r val) -> VS (r typ) -> VS (r val))
-> VS (r var) -> VS (r val) -> MS (r stmt)
CP.openFileR VS (JavaCode Value)
-> VS (JavaCode TypeData) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(OOTypeSym r typ, OOValueExpression r var val typ) =>
VS (r val) -> VS (r typ) -> VS (r val)
jOpenFileR
  openFileW :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
openFileW = (VS (JavaCode Value)
 -> VS (JavaCode TypeData)
 -> VS (JavaCode Value)
 -> VS (JavaCode Value))
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k)
       (typ :: k).
(AssignStatement r stmt var val, TypeSym r typ,
 Literal r val typ) =>
(VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val))
-> VS (r var) -> VS (r val) -> MS (r stmt)
CP.openFileW VS (JavaCode Value)
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(OOTypeSym r typ, OOValueExpression r var val typ) =>
VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val)
jOpenFileWorA
  openFileA :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
openFileA = (VS (JavaCode Value)
 -> VS (JavaCode TypeData)
 -> VS (JavaCode Value)
 -> VS (JavaCode Value))
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k)
       (typ :: k).
(AssignStatement r stmt var val, TypeSym r typ,
 Literal r val typ) =>
(VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val))
-> VS (r var) -> VS (r val) -> MS (r stmt)
CP.openFileA VS (JavaCode Value)
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(OOTypeSym r typ, OOValueExpression r var val typ) =>
VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val)
jOpenFileWorA
  closeFile :: VS (JavaCode Value) -> MS (JavaCode Statement)
closeFile = String -> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k)
       (stmt :: k).
(TypeSym r typ, InternalValueExp r var val typ,
 ValueStatement r stmt val) =>
String -> VS (r val) -> MS (r stmt)
G.closeFile String
jClose

instance PrintFile JavaCode Statement Value where
  printFile :: VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
printFile VS (JavaCode Value)
f      = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
False (VS (JavaCode Value) -> Maybe (VS (JavaCode Value))
forall a. a -> Maybe a
Just VS (JavaCode Value)
f) (VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val) -> VS (r val)
printFileFunc VS (JavaCode Value)
f)
  printFileLn :: VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
printFileLn VS (JavaCode Value)
f    = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
True  (VS (JavaCode Value) -> Maybe (VS (JavaCode Value))
forall a. a -> Maybe a
Just VS (JavaCode Value)
f) (VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val) -> VS (r val)
printFileLnFunc VS (JavaCode Value)
f)
  printFileStr :: VS (JavaCode Value) -> String -> MS (JavaCode Statement)
printFileStr VS (JavaCode Value)
f   = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
False (VS (JavaCode Value) -> Maybe (VS (JavaCode Value))
forall a. a -> Maybe a
Just VS (JavaCode Value)
f) (VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val) -> VS (r val)
printFileFunc VS (JavaCode Value)
f)   (VS (JavaCode Value) -> MS (JavaCode Statement))
-> (String -> VS (JavaCode Value))
-> String
-> MS (JavaCode Statement)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
String -> VS (r val)
litString
  printFileStrLn :: VS (JavaCode Value) -> String -> MS (JavaCode Statement)
printFileStrLn VS (JavaCode Value)
f = Bool
-> Maybe (VS (JavaCode Value))
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
True  (VS (JavaCode Value) -> Maybe (VS (JavaCode Value))
forall a. a -> Maybe a
Just VS (JavaCode Value)
f) (VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r val) -> VS (r val)
printFileLnFunc VS (JavaCode Value)
f) (VS (JavaCode Value) -> MS (JavaCode Statement))
-> (String -> VS (JavaCode Value))
-> String
-> MS (JavaCode Statement)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
String -> VS (r val)
litString

instance ReadFile JavaCode Statement Variable Value where
  getFileInput :: VS (JavaCode Value)
-> VS (JavaCode Variable) -> MS (JavaCode Statement)
getFileInput VS (JavaCode Value)
f VS (JavaCode Variable)
v = VS (JavaCode Variable)
v VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
&= VS (JavaCode Variable)
-> VS (JavaCode Value) -> VS (JavaCode Value)
jInput VS (JavaCode Variable)
v VS (JavaCode Value)
f
  discardFileInput :: VS (JavaCode Value) -> MS (JavaCode Statement)
discardFileInput = VS (JavaCode Value) -> MS (JavaCode Statement)
jDiscardInput
  getFileInputLine :: VS (JavaCode Value)
-> VS (JavaCode Variable) -> MS (JavaCode Statement)
getFileInputLine VS (JavaCode Value)
f VS (JavaCode Variable)
v = VS (JavaCode Variable)
v VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
&= VS (JavaCode Value)
f VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc
  discardFileLine :: VS (JavaCode Value) -> MS (JavaCode Statement)
discardFileLine = String -> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k)
       (stmt :: k).
(TypeSym r typ, InternalValueExp r var val typ,
 ValueStatement r stmt val) =>
String -> VS (r val) -> MS (r stmt)
CP.discardFileLine String
jNextLine
  getFileInputAll :: VS (JavaCode Value)
-> VS (JavaCode Variable) -> MS (JavaCode Statement)
getFileInputAll VS (JavaCode Value)
f VS (JavaCode Variable)
v = VS (JavaCode Value) -> MS (JavaCode Doc) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
VS (r val) -> MS (r bod) -> MS (r stmt)
while (VS (JavaCode Value)
f VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jHasNextLineFunc)
    (MS (JavaCode Statement) -> MS (JavaCode Doc)
forall {k} (r :: k -> *) (block :: k) (stmt :: k) (bod :: k).
(BlockSym r block stmt, BodySym r bod block) =>
MS (r stmt) -> MS (r bod)
oneLiner (MS (JavaCode Statement) -> MS (JavaCode Doc))
-> MS (JavaCode Statement) -> MS (JavaCode Doc)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
ListStatement r stmt val =>
VS (r val) -> VS (r val) -> MS (r stmt)
listAppend (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
v) (VS (JavaCode Value)
f VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc))

instance StringStatement JavaCode Statement Variable Value where
  stringSplit :: Char
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
stringSplit Char
d VS (JavaCode Variable)
vnew VS (JavaCode Value)
s = do
    (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> MethodState -> MethodState
addLangImport (String -> MethodState -> MethodState)
-> String -> MethodState -> MethodState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jArrays)
    ss <- LensLike'
  (Zoomed (StateT ValueState Identity) Doc) MethodState ValueState
-> StateT ValueState Identity Doc
-> StateT MethodState Identity Doc
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) Doc) MethodState ValueState
(ValueState -> Focusing Identity Doc ValueState)
-> MethodState -> Focusing Identity Doc MethodState
Lens' MethodState ValueState
lensMStoVS (StateT ValueState Identity Doc -> StateT MethodState Identity Doc)
-> StateT ValueState Identity Doc
-> StateT MethodState Identity Doc
forall a b. (a -> b) -> a -> b
$
      VS (JavaCode Variable)
-> VS (JavaCode Value) -> StateT ValueState Identity Doc
jStringSplit VS (JavaCode Variable)
vnew (VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
jAsListFunc VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string [VS (JavaCode Value)
s VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. Char -> VS (JavaCode FuncData)
forall (r :: * -> *) typ val.
(TypeSym r typ, Literal r val typ, OOFunctionSym r val typ) =>
Char -> VS (r FuncData)
jSplitFunc Char
d])
    mkStmt ss

  stringListVals :: [VS (JavaCode Variable)]
-> VS (JavaCode Value) -> MS (JavaCode Statement)
stringListVals = [VS (JavaCode Variable)]
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k)
       (typ :: k).
(MultiStatement r stmt, AssignStatement r stmt var val, List r val,
 ValueSym r val typ, Literal r val typ, RenderValue r var val typ,
 TypeElim r typ, VariableElim r var typ) =>
[VS (r var)] -> VS (r val) -> MS (r stmt)
M.stringListVals
  stringListLists :: [VS (JavaCode Variable)]
-> VS (JavaCode Value) -> MS (JavaCode Statement)
stringListLists = [VS (JavaCode Variable)]
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (var :: k) (val :: k) (typ :: k).
(BodySym r bod block, BlockSym r block stmt,
 ControlStatement r bod stmt var val, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, NumericExpression r val,
 VariableSym r var typ, VariableValue r var val, List r val,
 ListStatement r stmt val, TypeElim r typ, VariableElim r var typ,
 RenderValue r var val typ) =>
[VS (r var)] -> VS (r val) -> MS (r stmt)
M.stringListLists

instance FuncAppStatement JavaCode Statement Variable Value where
  inOutCall :: InOutCall JavaCode Statement Variable Value
inOutCall = (String
 -> VS (JavaCode TypeData)
 -> [VS (JavaCode Value)]
 -> VS (JavaCode Value))
-> InOutCall JavaCode Statement Variable Value
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
PosCall r val typ
funcApp
  extInOutCall :: String -> InOutCall JavaCode Statement Variable Value
extInOutCall String
m = (String
 -> VS (JavaCode TypeData)
 -> [VS (JavaCode Value)]
 -> VS (JavaCode Value))
-> InOutCall JavaCode Statement Variable Value
jInOutCall (String
-> String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
String -> PosCall r val typ
extFuncApp String
m)

instance OOFuncAppStatement JavaCode Statement Variable Value where
  selfInOutCall :: InOutCall JavaCode Statement Variable Value
selfInOutCall = (String
 -> VS (JavaCode TypeData)
 -> [VS (JavaCode Value)]
 -> VS (JavaCode Value))
-> InOutCall JavaCode Statement Variable Value
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
(InternalValueExp r var val typ, VariableValue r var val,
 SelfSym r var) =>
PosCall r val typ
selfMethodCall

instance CommentStatement JavaCode Statement where
  comment :: String -> MS (JavaCode Statement)
comment = Doc -> String -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
RenderStatement r stmt =>
Doc -> String -> MS (r stmt)
G.comment Doc
commentStart

instance ControlStatement JavaCode Body Statement Variable Value where
  break :: MS (JavaCode Statement)
break = Doc -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
RenderStatement r stmt =>
Doc -> MS (r stmt)
mkStmt Doc
R.break
  continue :: MS (JavaCode Statement)
continue = Doc -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
RenderStatement r stmt =>
Doc -> MS (r stmt)
mkStmt Doc
R.continue

  returnStmt :: VS (JavaCode Value) -> MS (JavaCode Statement)
returnStmt = Terminator -> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
(RenderStatement r stmt, ValueElim r val) =>
Terminator -> VS (r val) -> MS (r stmt)
G.returnStmt Terminator
Semi

  throw :: String -> MS (JavaCode Statement)
throw = (JavaCode Value -> Doc)
-> Terminator -> String -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (val :: k) (typ :: k) (stmt :: k).
(Literal r val typ, RenderStatement r stmt) =>
(r val -> Doc) -> Terminator -> String -> MS (r stmt)
G.throw JavaCode Value -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
jThrowDoc Terminator
Semi

  ifCond :: [(VS (JavaCode Value), MS (JavaCode Doc))]
-> MS (JavaCode Doc) -> MS (JavaCode Statement)
ifCond = (Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(VS (JavaCode Value), MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (val :: k).
(BodyElim r bod, RenderStatement r stmt, ValueElim r val) =>
(Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(VS (r val), MS (r bod))]
-> MS (r bod)
-> MS (r stmt)
G.ifCond Doc -> Doc
parens Doc
bodyStart OptionalSpace
G.defaultOptSpace Doc
elseIfLabel Doc
bodyEnd Doc
empty
  switch :: VS (JavaCode Value)
-> [(VS (JavaCode Value), MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
switch  = (Doc -> Doc)
-> MS (JavaCode Statement)
-> VS (JavaCode Value)
-> [(VS (JavaCode Value), MS (JavaCode Doc))]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (val :: k).
(BodyElim r bod, RenderStatement r stmt, StatementElim r stmt,
 ValueElim r val) =>
(Doc -> Doc)
-> MS (r stmt)
-> VS (r val)
-> [(VS (r val), MS (r bod))]
-> MS (r bod)
-> MS (r stmt)
C.switch Doc -> Doc
parens MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
MS (r stmt)
break

  ifExists :: VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
ifExists = VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k) (binder :: k) (typ :: k).
(ControlStatement r bod stmt var val,
 ValueExpression r var val binder typ) =>
VS (r val) -> MS (r bod) -> MS (r bod) -> MS (r stmt)
M.ifExists

  for :: MS (JavaCode Statement)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
for = Doc
-> Doc
-> MS (JavaCode Statement)
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (val :: k).
(BodyElim r bod, RenderStatement r stmt, StatementElim r stmt,
 ValueElim r val) =>
Doc
-> Doc
-> MS (r stmt)
-> VS (r val)
-> MS (r stmt)
-> MS (r bod)
-> MS (r stmt)
C.for Doc
bodyStart Doc
bodyEnd
  forRange :: VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forRange = VS (JavaCode Variable)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (scope :: k) (bod :: k) (stmt :: k)
       (var :: k) (val :: k).
(ScopeSym r scope, DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, Comparison r val,
 VariableValue r var val) =>
VS (r var)
-> VS (r val)
-> VS (r val)
-> VS (r val)
-> MS (r bod)
-> MS (r stmt)
M.forRange
  forEach :: VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forEach = Doc
-> Doc
-> Doc
-> Doc
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall (r :: * -> *) bod var stmt val.
(BodyElim r bod, InternalVarElim r var, RenderStatement r stmt,
 UnRepr r TypeData, ValueElim r val, VariableElim r var TypeData) =>
Doc
-> Doc
-> Doc
-> Doc
-> VS (r var)
-> VS (r val)
-> MS (r bod)
-> MS (r stmt)
CP.forEach Doc
bodyStart Doc
bodyEnd Doc
forLabel Doc
colon
  while :: VS (JavaCode Value) -> MS (JavaCode Doc) -> MS (JavaCode Statement)
while = (Doc -> Doc)
-> Doc
-> Doc
-> VS (JavaCode Value)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (val :: k).
(BodyElim r bod, RenderStatement r stmt, ValueElim r val) =>
(Doc -> Doc)
-> Doc -> Doc -> VS (r val) -> MS (r bod) -> MS (r stmt)
C.while Doc -> Doc
parens Doc
bodyStart Doc
bodyEnd

  tryCatch :: MS (JavaCode Doc) -> MS (JavaCode Doc) -> MS (JavaCode Statement)
tryCatch = (JavaCode Doc -> JavaCode Doc -> Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (bod :: k).
RenderStatement r stmt =>
(r bod -> r bod -> Doc) -> MS (r bod) -> MS (r bod) -> MS (r stmt)
G.tryCatch JavaCode Doc -> JavaCode Doc -> Doc
forall {k} (r :: k -> *) (bod :: k).
BodyElim r bod =>
r bod -> r bod -> Doc
jTryCatch

  assert :: VS (JavaCode Value)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
assert VS (JavaCode Value)
condition VS (JavaCode Value)
errorMessage = do
    cond <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Value))
  MethodState
  ValueState
-> VS (JavaCode Value)
-> StateT MethodState Identity (JavaCode 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) (JavaCode Value))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Value) ValueState)
-> MethodState -> Focusing Identity (JavaCode Value) MethodState
Lens' MethodState ValueState
lensMStoVS VS (JavaCode Value)
condition
    errMsg <- zoom lensMStoVS errorMessage
    mkStmt (jAssert cond errMsg)

instance ObserverPattern JavaCode Statement TypeData where
  notifyObservers :: VS (JavaCode FuncData)
-> VS (JavaCode TypeData) -> MS (JavaCode Statement)
notifyObservers = VS (JavaCode FuncData)
-> VS (JavaCode TypeData) -> MS (JavaCode Statement)
forall (r :: * -> *) bod block stmt typ val var scope.
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 Literal r val typ, VariableSym r var typ, VariableValue r var val,
 Comparison r val, List r val, ValueStatement r stmt val,
 ScopeSym r scope, DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, OOFunctionSym r val typ) =>
VS (r FuncData) -> VS (r typ) -> MS (r stmt)
M.notifyObservers

instance StrategyPattern JavaCode Body Block Variable Value where
  runStrategy :: String
-> [(String, MS (JavaCode Doc))]
-> Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Variable))
-> MS (JavaCode Doc)
runStrategy = String
-> [(String, MS (JavaCode Doc))]
-> Maybe (VS (JavaCode Value))
-> Maybe (VS (JavaCode Variable))
-> MS (JavaCode Doc)
forall (r :: * -> *) stmt var val bod.
(EmptyStatement r stmt, AssignStatement r stmt var val,
 BodyElim r bod, Monad r, RenderStatement r stmt,
 StatementElim r stmt) =>
String
-> [(String, MS (r bod))]
-> Maybe (VS (r val))
-> Maybe (VS (r var))
-> MS (r Doc)
M.runStrategy

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

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

instance VisibilityElim JavaCode Doc where
  visibility :: JavaCode Doc -> Doc
visibility = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

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

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

instance ParameterSym JavaCode ParamData Variable where
  param :: VS (JavaCode Variable) -> MS (JavaCode ParamData)
param = (JavaCode Variable -> Doc)
-> VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k) (typ :: k).
(RenderParam r param var, VariableElim r var typ) =>
(r var -> Doc) -> VS (r var) -> MS (r param)
G.param JavaCode Variable -> Doc
forall (r :: * -> *) var.
(InternalVarElim r var, UnRepr r TypeData,
 VariableElim r var TypeData) =>
r var -> Doc
renderParam
  pointerParam :: VS (JavaCode Variable) -> MS (JavaCode ParamData)
pointerParam = VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k).
ParameterSym r param var =>
VS (r var) -> MS (r param)
param

instance RenderParam JavaCode ParamData Variable where
  paramFromData :: VS (JavaCode Variable) -> Doc -> MS (JavaCode ParamData)
paramFromData VS (JavaCode Variable)
v' Doc
d = do
    v <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> VS (JavaCode Variable)
-> StateT MethodState Identity (JavaCode 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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS VS (JavaCode Variable)
v'
    toState $ on2CodeValues pd v (toCode d)

instance ParamElim JavaCode ParamData TypeData where
  parameterName :: JavaCode ParamData -> String
parameterName = JavaCode Variable -> String
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> String
variableName (JavaCode Variable -> String)
-> (JavaCode ParamData -> JavaCode Variable)
-> JavaCode ParamData
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable) -> JavaCode ParamData -> JavaCode Variable
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
onCodeValue ParamData -> Variable
paramVar
  parameterType :: JavaCode ParamData -> JavaCode TypeData
parameterType = JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType (JavaCode Variable -> JavaCode TypeData)
-> (JavaCode ParamData -> JavaCode Variable)
-> JavaCode ParamData
-> JavaCode TypeData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> Variable) -> JavaCode ParamData -> JavaCode Variable
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
onCodeValue ParamData -> Variable
paramVar
  parameter :: JavaCode ParamData -> Doc
parameter = ParamData -> Doc
paramDoc (ParamData -> Doc)
-> (JavaCode ParamData -> ParamData) -> JavaCode ParamData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode ParamData -> ParamData
forall a. JavaCode a -> a
unJC

instance MethodSym JavaCode MethodData Doc ParamData Body Variable TypeData where
  docMain :: MS (JavaCode Doc) -> MS (JavaCode MethodData)
docMain = MS (JavaCode Doc) -> MS (JavaCode MethodData)
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
OORenderSym
  r
  file
  mod
  cls
  stvr
  mthd
  attch
  vis
  param
  bod
  block
  stmt
  var
  scope
  val
  binder
  typ =>
MS (r bod) -> MS (r mthd)
CP.docMain
  function :: String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
function = String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall {k} (r :: k -> *) (attch :: k) (typ :: k) (mthd :: k)
       (vis :: k) (param :: k) (bod :: k).
(AttachmentSym r attch, MethodTypeSym r typ,
 OORenderMethod r mthd attch vis param bod typ) =>
String
-> r vis
-> VS (r typ)
-> [MS (r param)]
-> MS (r bod)
-> MS (r mthd)
G.function
  mainFunction :: MS (JavaCode Doc) -> MS (JavaCode MethodData)
mainFunction = VS (JavaCode TypeData)
-> String -> MS (JavaCode Doc) -> MS (JavaCode MethodData)
forall (r :: * -> *) attch var mthd vis param bod.
(AttachmentSym r attch, TypeSym r TypeData,
 VariableSym r var TypeData, MethodTypeSym r TypeData,
 OORenderMethod r mthd attch vis param bod TypeData,
 ParameterSym r param var, UnRepr r TypeData, Monad r,
 VisibilitySym r vis) =>
VS (r TypeData) -> String -> MS (r bod) -> MS (r mthd)
CP.mainFunction VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string String
mainFunc
  docFunc :: String
-> [String]
-> Maybe String
-> MS (JavaCode MethodData)
-> MS (JavaCode MethodData)
docFunc = String
-> [String]
-> Maybe String
-> MS (JavaCode MethodData)
-> MS (JavaCode MethodData)
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
String -> [String] -> Maybe String -> MS (r mthd) -> MS (r mthd)
CP.doxFunc

  inOutFunc :: String
-> JavaCode Doc -> InOutFunc JavaCode MethodData Doc Variable
inOutFunc String
n JavaCode Doc
s = (VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode MethodData))
-> InOutFunc JavaCode MethodData Doc Variable
forall mthd.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode mthd))
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
jInOut (String
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall {k} (r :: k -> *) (mthd :: k) (vis :: k) (param :: k)
       (bod :: k) (var :: k) (typ :: k).
MethodSym r mthd vis param bod var typ =>
String
-> r vis
-> VS (r typ)
-> [MS (r param)]
-> MS (r bod)
-> MS (r mthd)
function String
n JavaCode Doc
s)
  docInOutFunc :: String
-> JavaCode Doc -> DocInOutFunc JavaCode MethodData Doc Variable
docInOutFunc String
n JavaCode Doc
s = InOutFunc JavaCode MethodData Doc Variable
-> DocInOutFunc JavaCode MethodData Doc Variable
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
([VS (r Variable)]
 -> [VS (r Variable)]
 -> [VS (r Variable)]
 -> MS (r Doc)
 -> MS (r mthd))
-> String
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> MS (r Doc)
-> MS (r mthd)
jDocInOut (String
-> JavaCode Doc -> InOutFunc JavaCode MethodData Doc Variable
forall {k} (r :: k -> *) (mthd :: k) (vis :: k) (param :: k)
       (bod :: k) (var :: k) (typ :: k).
MethodSym r mthd vis param bod var typ =>
String -> r vis -> InOutFunc r mthd bod var
inOutFunc String
n JavaCode Doc
s)

instance OOMethodSym JavaCode MethodData Doc Doc ParamData Body Variable Value TypeData where
  method :: String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
method = String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall {k} (r :: k -> *) (typ :: k) (mthd :: k) (attch :: k)
       (vis :: k) (param :: k) (bod :: k).
(MethodTypeSym r typ,
 OORenderMethod r mthd attch vis param bod typ) =>
String
-> r vis
-> r attch
-> VS (r typ)
-> [MS (r param)]
-> MS (r bod)
-> MS (r mthd)
G.method
  getMethod :: VS (JavaCode Variable) -> MS (JavaCode MethodData)
getMethod = VS (JavaCode Variable) -> MS (JavaCode MethodData)
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
OORenderSym
  r
  file
  mod
  cls
  stvr
  mthd
  attch
  vis
  param
  bod
  block
  stmt
  var
  scope
  val
  binder
  typ =>
VS (r var) -> MS (r mthd)
G.getMethod
  setMethod :: VS (JavaCode Variable) -> MS (JavaCode MethodData)
setMethod = VS (JavaCode Variable) -> MS (JavaCode MethodData)
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
OORenderSym
  r
  file
  mod
  cls
  stvr
  mthd
  attch
  vis
  param
  bod
  block
  stmt
  var
  scope
  val
  binder
  typ =>
VS (r var) -> MS (r mthd)
G.setMethod
  constructor :: [MS (JavaCode ParamData)]
-> NamedArgs JavaCode Variable Value
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
constructor [MS (JavaCode ParamData)]
ps NamedArgs JavaCode Variable Value
is MS (JavaCode Doc)
b = MS String
getClassName MS String
-> (String -> MS (JavaCode MethodData)) -> MS (JavaCode 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 (JavaCode ParamData)]
-> NamedArgs JavaCode Variable Value
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
OORenderSym
  r
  file
  mod
  cls
  stvr
  mthd
  attch
  vis
  param
  bod
  block
  stmt
  var
  scope
  val
  binder
  typ =>
String
-> [MS (r param)]
-> Initializers r var val
-> MS (r bod)
-> MS (r mthd)
CP.constructor String
n [MS (JavaCode ParamData)]
ps NamedArgs JavaCode Variable Value
is MS (JavaCode Doc)
b)

  inOutMethod :: String
-> JavaCode Doc
-> JavaCode Doc
-> InOutFunc JavaCode MethodData Doc Variable
inOutMethod String
n JavaCode Doc
s JavaCode Doc
p = (VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode MethodData))
-> InOutFunc JavaCode MethodData Doc Variable
forall mthd.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode mthd))
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
jInOut (String
-> JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall {k} (r :: k -> *) (mthd :: k) (attch :: k) (vis :: k)
       (param :: k) (bod :: k) (var :: k) (val :: k) (typ :: k).
OOMethodSym r mthd attch vis param bod var val typ =>
String
-> r vis
-> r attch
-> VS (r typ)
-> [MS (r param)]
-> MS (r bod)
-> MS (r mthd)
method String
n JavaCode Doc
s JavaCode Doc
p)
  docInOutMethod :: String
-> JavaCode Doc
-> JavaCode Doc
-> DocInOutFunc JavaCode MethodData Doc Variable
docInOutMethod String
n JavaCode Doc
s JavaCode Doc
p = InOutFunc JavaCode MethodData Doc Variable
-> DocInOutFunc JavaCode MethodData Doc Variable
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
([VS (r Variable)]
 -> [VS (r Variable)]
 -> [VS (r Variable)]
 -> MS (r Doc)
 -> MS (r mthd))
-> String
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> MS (r Doc)
-> MS (r mthd)
jDocInOut (String
-> JavaCode Doc
-> JavaCode Doc
-> InOutFunc JavaCode MethodData Doc Variable
forall {k} (r :: k -> *) (mthd :: k) (attch :: k) (vis :: k)
       (param :: k) (bod :: k) (var :: k) (val :: k) (typ :: k).
OOMethodSym r mthd attch vis param bod var val typ =>
String -> r vis -> r attch -> InOutFunc r mthd bod var
inOutMethod String
n JavaCode Doc
s JavaCode Doc
p)

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

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

instance OORenderMethod JavaCode MethodData Doc Doc ParamData Body TypeData where
  intMethod :: Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
intMethod Bool
m String
n JavaCode Doc
s JavaCode Doc
p MS (JavaCode TypeData)
t [MS (JavaCode ParamData)]
ps MS (JavaCode Doc)
b = do
    tp <- MS (JavaCode TypeData)
t
    pms <- sequence ps
    bd <- b
    mem <- zoom lensMStoVS getMethodExcMap
    es <- getExceptions
    mn <- zoom lensMStoFS getModuleName
    let excs = JavaCode Exception -> Exception
forall a. JavaCode a -> a
unJC (JavaCode Exception -> Exception)
-> (ExceptionType -> JavaCode Exception)
-> ExceptionType
-> Exception
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionType -> JavaCode Exception
forall (r :: * -> *).
HasException r =>
ExceptionType -> r Exception
toConcreteExc (ExceptionType -> Exception) -> [ExceptionType] -> [Exception]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ExceptionType]
-> ([ExceptionType] -> [ExceptionType])
-> Maybe [ExceptionType]
-> [ExceptionType]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [ExceptionType]
es ([ExceptionType] -> [ExceptionType]
forall a. Eq a => [a] -> [a]
nub ([ExceptionType] -> [ExceptionType])
-> ([ExceptionType] -> [ExceptionType])
-> [ExceptionType]
-> [ExceptionType]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([ExceptionType] -> [ExceptionType] -> [ExceptionType]
forall a. [a] -> [a] -> [a]
++ [ExceptionType]
es))
          (QualifiedName
-> Map QualifiedName [ExceptionType] -> Maybe [ExceptionType]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> String -> QualifiedName
qualName String
mn String
n) Map QualifiedName [ExceptionType]
mem)
    modify ((if m then setCurrMain else id) . addExceptionImports excs)
    pure $ toCode $ mthd n $ jMethod n (exc <$> excs) s p tp pms bd
  intFunc :: Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
intFunc = Bool
-> String
-> JavaCode Doc
-> JavaCode Doc
-> MS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode MethodData)
forall {k} (r :: k -> *) (mthd :: k) (attch :: k) (vis :: k)
       (param :: k) (bod :: k) (typ :: k).
OORenderMethod r mthd attch vis param bod typ =>
Bool
-> String
-> r vis
-> r attch
-> MS (r typ)
-> [MS (r param)]
-> MS (r bod)
-> MS (r mthd)
intMethod
  destructor :: forall stvr. [CSStateVar JavaCode stvr] -> MS (JavaCode MethodData)
destructor [CSStateVar JavaCode stvr]
_ = String -> MS (JavaCode MethodData)
forall a. HasCallStack => String -> a
error (String -> MS (JavaCode MethodData))
-> String -> MS (JavaCode MethodData)
forall a b. (a -> b) -> a -> b
$ String -> String
CP.destructorError String
jName

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

instance StateVarSym JavaCode Doc Doc Doc Variable Value where
  stateVar :: JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode Variable)
-> CSStateVar JavaCode Doc
stateVar = JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode Variable)
-> CSStateVar JavaCode Doc
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
(Monad r,
 OORenderSym
   r
   file
   mod
   cls
   stvr
   mthd
   attch
   vis
   param
   bod
   block
   stmt
   var
   scope
   val
   binder
   typ) =>
r vis -> r attch -> VS (r var) -> CS (r Doc)
CP.stateVar
  stateVarDef :: JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> CSStateVar JavaCode Doc
stateVarDef = JavaCode Doc
-> JavaCode Doc
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> CSStateVar JavaCode Doc
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
(OORenderSym
   r
   file
   mod
   cls
   stvr
   mthd
   attch
   vis
   param
   bod
   block
   stmt
   var
   scope
   val
   binder
   typ,
 Monad r) =>
r vis -> r attch -> VS (r var) -> VS (r val) -> CS (r Doc)
CP.stateVarDef
  constVar :: JavaCode Doc
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> CSStateVar JavaCode Doc
constVar = Doc
-> JavaCode Doc
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> CSStateVar JavaCode Doc
forall (r :: * -> *) mthd vis param bod block stmt var scope val
       binder typ.
(CommonRenderSym
   r mthd vis param bod block stmt var scope val binder typ,
 Monad r) =>
Doc -> r vis -> VS (r var) -> VS (r val) -> CS (r Doc)
CP.constVar (JavaCode Doc -> Doc
forall {k} (r :: k -> *) (attch :: k).
PermElim r attch =>
r attch -> Doc
RC.perm (JavaCode Doc
forall {k} (r :: k -> *) (attch :: k).
AttachmentSym r attch =>
r attch
classLevel :: JavaCode Doc))

instance StateVarElim JavaCode StateVar where
  stateVar :: JavaCode Doc -> Doc
stateVar = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance ClassSym JavaCode Class StateVar MethodData where
  buildClass :: Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
buildClass = Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) cls stvr mthd vis.
(RenderClass r cls stvr mthd vis, VisibilitySym r vis) =>
Maybe String
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
G.buildClass
  extraClass :: String
-> Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
extraClass = String
-> Maybe String
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) cls stvr mthd vis.
(RenderClass r cls stvr mthd vis, RenderVisibility r vis) =>
String
-> Maybe String
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
jExtraClass
  implementingClass :: String
-> [String]
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
implementingClass = String
-> [String]
-> [CSStateVar JavaCode Doc]
-> [MS (JavaCode MethodData)]
-> [MS (JavaCode MethodData)]
-> CSStateVar JavaCode Doc
forall (r :: * -> *) cls stvr mthd vis.
(RenderClass r cls stvr mthd vis, VisibilitySym r vis) =>
String
-> [String]
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
G.implementingClass

  docClass :: String -> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
docClass = String -> CSStateVar JavaCode Doc -> CSStateVar JavaCode Doc
forall (r :: * -> *) cls stvr mthd vis.
(BlockCommentSym r, RenderClass r cls stvr mthd vis) =>
String -> CS (r cls) -> CS (r cls)
CP.doxClass

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

  inherit :: Maybe String -> JavaCode Doc
inherit Maybe String
n = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ Doc -> (String -> Doc) -> Maybe String -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
empty ((Doc
jExtends Doc -> Doc -> Doc
<+>) (Doc -> Doc) -> (String -> Doc) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
text) Maybe String
n
  implements :: [String] -> JavaCode Doc
implements [String]
is = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ Doc
jImplements Doc -> Doc -> Doc
<+> String -> Doc
text (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
listSep [String]
is)

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

instance ClassElim JavaCode Class where
  class' :: JavaCode Doc -> Doc
class' = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance ModuleSym JavaCode ModData Class MethodData where
  buildModule :: String
-> [String]
-> [MS (JavaCode MethodData)]
-> [CSStateVar JavaCode Doc]
-> FS (JavaCode ModData)
buildModule String
n = String
-> (String -> JavaCode Doc)
-> [String]
-> [MS (JavaCode MethodData)]
-> [CSStateVar JavaCode Doc]
-> FS (JavaCode ModData)
forall (r :: * -> *) file mod cls stvr mthd attch vis param bod
       block stmt var scope val binder typ.
(OORenderSym
   r
   file
   mod
   cls
   stvr
   mthd
   attch
   vis
   param
   bod
   block
   stmt
   var
   scope
   val
   binder
   typ,
 UnRepr r Doc) =>
String
-> (String -> r Doc)
-> [String]
-> [MS (r mthd)]
-> [CS (r cls)]
-> FS (r mod)
CP.buildModule' String
n String -> JavaCode Doc
forall (r :: * -> *). ImportSym r => String -> r Doc
langImport

instance RenderMod JavaCode ModData where
  modFromData :: String -> FS Doc -> FS (JavaCode ModData)
modFromData String
n = String
-> (Doc -> JavaCode ModData) -> FS Doc -> FS (JavaCode ModData)
forall {k} (r :: k -> *) (mod :: k).
String -> (Doc -> r mod) -> FS Doc -> FS (r mod)
G.modFromData String
n (ModData -> JavaCode ModData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (ModData -> JavaCode ModData)
-> (Doc -> ModData) -> Doc -> JavaCode ModData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc -> ModData
md String
n)
  updateModuleDoc :: (Doc -> Doc) -> JavaCode ModData -> JavaCode ModData
updateModuleDoc Doc -> Doc
f = (ModData -> ModData) -> JavaCode ModData -> JavaCode ModData
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
onCodeValue ((Doc -> Doc) -> ModData -> ModData
updateMod Doc -> Doc
f)

instance ModuleElim JavaCode ModData where
  module' :: JavaCode ModData -> Doc
module' = ModData -> Doc
modDoc (ModData -> Doc)
-> (JavaCode ModData -> ModData) -> JavaCode ModData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode ModData -> ModData
forall a. JavaCode a -> a
unJC

instance BlockCommentSym JavaCode where
  blockComment :: [String] -> JavaCode Doc
blockComment [String]
lns = Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode 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 (JavaCode Doc)
docComment = ([String] -> JavaCode Doc)
-> State a [String] -> State a (JavaCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue (\[String]
lns -> Doc -> JavaCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> JavaCode Doc) -> Doc -> JavaCode Doc
forall a b. (a -> b) -> a -> b
$ [String] -> Doc -> Doc -> Doc
R.docCmt [String]
lns Doc
docCmtStart
    Doc
blockCmtEnd)

instance BlockCommentElim JavaCode where
  blockComment' :: JavaCode Doc -> Doc
blockComment' = JavaCode Doc -> Doc
forall a. JavaCode a -> a
unJC

instance HasException JavaCode where
  toConcreteExc :: ExceptionType -> JavaCode Exception
toConcreteExc ExceptionType
Standard = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> Exception
stdExc String
exceptionObj
  toConcreteExc ExceptionType
FileNotFound = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> String -> Exception
exception (String -> String
javaImport String
io) String
jFNFExc
  toConcreteExc ExceptionType
IO = Exception -> JavaCode Exception
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Exception -> JavaCode Exception)
-> Exception -> JavaCode Exception
forall a b. (a -> b) -> a -> b
$ String -> String -> Exception
exception (String -> String
javaImport String
io) String
jIOExc

jName, jVersion :: String
jName :: String
jName = String
"Java"
jVersion :: String
jVersion = String
"14"

jImport :: Label -> Doc
jImport :: String -> Doc
jImport String
n = Doc
importLabel Doc -> Doc -> Doc
<+> String -> Doc
text String
n Doc -> Doc -> Doc
<> Doc
endStatement

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

jInfileType :: (Monad r) => VS (r TypeData)
jInfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
jInfileType = do
  tpf <- CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
InFile String
jScanner Doc
jScanner'
  modifyReturn (addLangImportVS $ utilImport jScanner) tpf

jOutfileType :: (Monad r) => VS (r TypeData)
jOutfileType :: forall (r :: * -> *). Monad r => VS (r TypeData)
jOutfileType = do
  tpf <- CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData CodeType
OutFile String
jPrintWriter (String -> Doc
text String
jPrintWriter)
  modifyReturn (addLangImportVS $ ioImport jPrintWriter) tpf

jExtends, jImplements, jFinal, jScanner', jLambdaSep :: Doc
jExtends :: Doc
jExtends = String -> Doc
text String
"extends"
jImplements :: Doc
jImplements = String -> Doc
text String
"implements"
jFinal :: Doc
jFinal = String -> Doc
text String
"final"
jScanner' :: Doc
jScanner' = String -> Doc
text String
jScanner
jLambdaSep :: Doc
jLambdaSep = String -> Doc
text String
"->"

arrayList, jBool, jBool', jInteger, jObject, jScanner, jContains, jPrintWriter,
  jFile, jFileWriter, jIOExc, jFNFExc, jArrays, jSet, jAsList, jSetOf, jStdIn,
  jStdOut, jPrintLn, jEquals, jParseInt, jParseDbl, jParseFloat, jIndex,
  jListAdd, jListRemove, jListUnion, jListAccess, jListSet, jClose, jNext,
  jNextLine, jNextBool, jHasNextLine, jCharAt, jSplit, io, util :: String
arrayList :: String
arrayList = String
"ArrayList"
jBool :: String
jBool = String
"boolean"
jBool' :: String
jBool' = String
"Boolean"
jInteger :: String
jInteger = String
"Integer"
jObject :: String
jObject = String
"Object"
jScanner :: String
jScanner = String
"Scanner"
jContains :: String
jContains = String
"contains"
jPrintWriter :: String
jPrintWriter = String
"PrintWriter"
jFile :: String
jFile = String
"File"
jFileWriter :: String
jFileWriter = String
"FileWriter"
jIOExc :: String
jIOExc = String
"IOException"
jFNFExc :: String
jFNFExc = String
"FileNotFoundException"
jArrays :: String
jArrays = String
"Arrays"
jSet :: String
jSet = String
"Set"
jAsList :: String
jAsList = String
jArrays String -> String -> String
`access` String
"asList"
jSetOf :: String
jSetOf = String
jSet String -> String -> String
`access` String
"of"
jStdIn :: String
jStdIn = String
"in"
jStdOut :: String
jStdOut = String
"out"
jPrintLn :: String
jPrintLn = String
"println"
jEquals :: String
jEquals = String
"equals"
jParseInt :: String
jParseInt = String
jInteger String -> String -> String
`access` String
"parseInt"
jParseDbl :: String
jParseDbl = String
CP.doubleRender String -> String -> String
`access` String
"parseDouble"
jParseFloat :: String
jParseFloat = String
CP.floatRender String -> String -> String
`access` String
"parseFloat"
jIndex :: String
jIndex = String
"indexOf"
jListAdd :: String
jListAdd = String
"add"
jListRemove :: String
jListRemove = String
"remove"
jListUnion :: String
jListUnion = String
"addAll"
jListAccess :: String
jListAccess = String
"get"
jListSet :: String
jListSet = String
"set"
jClose :: String
jClose = String
"close"
jNext :: String
jNext = String
"next"
jNextLine :: String
jNextLine = String
"nextLine"
jNextBool :: String
jNextBool = String
"nextBoolean"
jHasNextLine :: String
jHasNextLine = String
"hasNextLine"
jCharAt :: String
jCharAt = String
"charAt"
jSplit :: String
jSplit = String
"split"
io :: String
io = String
"io"
util :: String
util = String
"util"

javaImport, ioImport, utilImport :: String -> String
javaImport :: String -> String
javaImport = String -> String -> String
access String
"java"
ioImport :: String -> String
ioImport = String -> String
javaImport (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
io
utilImport :: String -> String
utilImport = String -> String
javaImport (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
util

jSystem :: String -> Doc
jSystem :: String -> Doc
jSystem = String -> Doc
text (String -> Doc) -> (String -> String) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
access String
"System"

jUnaryMath :: (Monad r) => String -> VSOp r
jUnaryMath :: forall (r :: * -> *). Monad r => String -> VSOp r
jUnaryMath = String -> VSOp r
forall (r :: * -> *). Monad r => String -> VSOp r
unOpPrec (String -> VSOp r) -> (String -> String) -> String -> VSOp r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
mathFunc

jListType
  :: (TypeElim r TypeData, UnRepr r TypeData, Monad r)
  => VS (r TypeData) -> VS (r TypeData)
jListType :: forall (r :: * -> *).
(TypeElim r TypeData, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jListType VS (r TypeData)
t = do
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
arrayList)
  VS (r TypeData)
t VS (r TypeData)
-> (r TypeData -> VS (r TypeData)) -> VS (r TypeData)
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (CodeType -> VS (r TypeData)
jListType' (CodeType -> VS (r TypeData))
-> (r TypeData -> CodeType) -> r TypeData -> VS (r TypeData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType)
  where jListType' :: CodeType -> VS (r TypeData)
jListType' CodeType
Integer = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
List CodeType
Integer)
          String
lstInt (String -> Doc
text String
lstInt)
        jListType' CodeType
Float = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.float
        jListType' CodeType
Double = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.double
        jListType' CodeType
Boolean = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
List CodeType
Boolean) String
lstBool (String -> Doc
text String
lstBool)
        jListType' CodeType
_ = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.listType String
arrayList VS (r TypeData)
t
        lstInt :: String
lstInt = String
arrayList String -> String -> String
`containing` String
jInteger
        lstBool :: String
lstBool = String
arrayList String -> String -> String
`containing` String
jBool'

jSetType
  :: (TypeElim r TypeData, UnRepr r TypeData, Monad r)
  => VS (r TypeData) -> VS (r TypeData)
jSetType :: forall (r :: * -> *).
(TypeElim r TypeData, UnRepr r TypeData, Monad r) =>
VS (r TypeData) -> VS (r TypeData)
jSetType VS (r TypeData)
t = do
  (ValueState -> ValueState) -> StateT ValueState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (String -> ValueState -> ValueState
addLangImportVS (String -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
"Set")
  VS (r TypeData)
t VS (r TypeData)
-> (r TypeData -> VS (r TypeData)) -> VS (r TypeData)
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (CodeType -> VS (r TypeData)
jSetType' (CodeType -> VS (r TypeData))
-> (r TypeData -> CodeType) -> r TypeData -> VS (r TypeData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r TypeData -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType)
  where jSetType' :: CodeType -> VS (r TypeData)
jSetType' CodeType
Integer = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
Set CodeType
Integer)
          String
stInt (String -> Doc
text String
stInt)
        jSetType' CodeType
Float = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.float
        jSetType' CodeType
Double = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
forall (r :: * -> *). Monad r => VS (r TypeData)
CP.double
        jSetType' CodeType
Boolean = CodeType -> String -> Doc -> VS (r TypeData)
forall (r :: * -> *).
Monad r =>
CodeType -> String -> Doc -> VS (r TypeData)
typeFromData (CodeType -> CodeType
Set CodeType
Boolean) String
stBool (String -> Doc
text String
stBool)
        jSetType' CodeType
_ = String -> VS (r TypeData) -> VS (r TypeData)
forall (r :: * -> *).
(Monad r, TypeElim r TypeData, UnRepr r TypeData) =>
String -> VS (r TypeData) -> VS (r TypeData)
C.setType String
"Set" VS (r TypeData)
t
        stInt :: String
stInt = String
"Set" String -> String -> String
`containing` String
jInteger
        stBool :: String
stBool = String
"Set" String -> String -> String
`containing` String
jBool'

jArrayType :: VS (JavaCode TypeData)
jArrayType :: VS (JavaCode TypeData)
jArrayType = VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
TypeSym r typ =>
VS (r typ) -> VS (r typ)
arrayType (String -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
OOTypeSym r typ =>
String -> VS (r typ)
obj String
jObject)

jLitArray
  :: VS (JavaCode TypeData) -> [VS (JavaCode Value)] -> VS (JavaCode Value)
jLitArray :: VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
jLitArray VS (JavaCode TypeData)
t' [VS (JavaCode Value)]
es' = do
  es <- [VS (JavaCode Value)]
-> StateT ValueState Identity [JavaCode 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 [VS (JavaCode Value)]
es'
  lt <- arrayType t'
  mkVal lt (new' <+> renderType lt
    <+> braces (valueList es))

jFileType :: (OOTypeSym r typ) => VS (r typ)
jFileType :: forall {k} (r :: k -> *) (typ :: k). OOTypeSym r typ => VS (r typ)
jFileType = do
  tpf <- String -> VS (r typ)
forall {k} (r :: k -> *) (typ :: k).
OOTypeSym r typ =>
String -> VS (r typ)
obj String
jFile
  modifyReturn (addLangImportVS $ ioImport jFile) tpf

jFileWriterType :: (OOTypeSym r typ) => VS (r typ)
jFileWriterType :: forall {k} (r :: k -> *) (typ :: k). OOTypeSym r typ => VS (r typ)
jFileWriterType = do
  tpf <- String -> VS (r typ)
forall {k} (r :: k -> *) (typ :: k).
OOTypeSym r typ =>
String -> VS (r typ)
obj String
jFileWriter
  modifyReturn (addLangImportVS $ ioImport jFileWriter) tpf

jAsListFunc
  :: VS (JavaCode TypeData) -> [VS (JavaCode Value)] -> VS (JavaCode Value)
jAsListFunc :: VS (JavaCode TypeData)
-> [VS (JavaCode Value)] -> VS (JavaCode Value)
jAsListFunc VS (JavaCode TypeData)
t = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
PosCall r val typ
funcApp String
jAsList (VS (JavaCode TypeData) -> VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k).
TypeSym r typ =>
VS (r typ) -> VS (r typ)
listType VS (JavaCode TypeData)
t)

jEqualsFunc :: VS (JavaCode Value) -> VS (JavaCode FuncData)
jEqualsFunc :: VS (JavaCode Value) -> VS (JavaCode FuncData)
jEqualsFunc VS (JavaCode Value)
v = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jEquals VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool [VS (JavaCode Value)
v]

jParseIntFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseIntFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseIntFunc VS (JavaCode Value)
v = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
PosCall r val typ
funcApp String
jParseInt VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
int [VS (JavaCode Value)
v]

jParseDblFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseDblFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseDblFunc VS (JavaCode Value)
v = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
PosCall r val typ
funcApp String
jParseDbl VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
double [VS (JavaCode Value)
v]

jParseFloatFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseFloatFunc :: VS (JavaCode Value) -> VS (JavaCode Value)
jParseFloatFunc VS (JavaCode Value)
v = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
PosCall r val typ
funcApp String
jParseFloat VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
float [VS (JavaCode Value)
v]

jNextFunc :: VS (JavaCode FuncData)
jNextFunc :: VS (JavaCode FuncData)
jNextFunc = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jNext VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string []

jNextLineFunc :: VS (JavaCode FuncData)
jNextLineFunc :: VS (JavaCode FuncData)
jNextLineFunc = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jNextLine VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string []

jNextBoolFunc :: VS (JavaCode FuncData)
jNextBoolFunc :: VS (JavaCode FuncData)
jNextBoolFunc = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jNextBool VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool []

jHasNextLineFunc :: VS (JavaCode FuncData)
jHasNextLineFunc :: VS (JavaCode FuncData)
jHasNextLineFunc = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jHasNextLine VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool []

jCharAtFunc :: VS (JavaCode FuncData)
jCharAtFunc :: VS (JavaCode FuncData)
jCharAtFunc = String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jCharAt VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
char [Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
0]

jSplitFunc
  :: (TypeSym r typ, Literal r val typ, OOFunctionSym r val typ)
  => Char -> VS (r FuncData)
jSplitFunc :: forall (r :: * -> *) typ val.
(TypeSym r typ, Literal r val typ, OOFunctionSym r val typ) =>
Char -> VS (r FuncData)
jSplitFunc Char
d = String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
String -> VS (r typ) -> [VS (r val)] -> VS (r FuncData)
func String
jSplit (VS (r typ) -> VS (r typ)
forall {k} (r :: k -> *) (typ :: k).
TypeSym r typ =>
VS (r typ) -> VS (r typ)
listType VS (r typ)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string) [String -> VS (r val)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
String -> VS (r val)
litString [Char
d]]

jEquality :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
jEquality :: VS (JavaCode Value) -> VS (JavaCode Value) -> VS (JavaCode Value)
jEquality VS (JavaCode Value)
v1 VS (JavaCode Value)
v2 = VS (JavaCode Value)
v2 VS (JavaCode Value)
-> (JavaCode Value -> VS (JavaCode Value)) -> VS (JavaCode Value)
forall a b.
StateT ValueState Identity a
-> (a -> StateT ValueState Identity b)
-> StateT ValueState Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CodeType -> VS (JavaCode Value)
jEquality' (CodeType -> VS (JavaCode Value))
-> (JavaCode Value -> CodeType)
-> JavaCode Value
-> VS (JavaCode Value)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode TypeData -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType (JavaCode TypeData -> CodeType)
-> (JavaCode Value -> JavaCode TypeData)
-> JavaCode Value
-> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JavaCode Value -> JavaCode TypeData
forall {k} (r :: k -> *) (val :: k) (typ :: k).
ValueSym r val typ =>
r val -> r typ
valueType
  where jEquality' :: CodeType -> VS (JavaCode Value)
jEquality' CodeType
String = VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
objAccess VS (JavaCode Value)
v1 (VS (JavaCode Value) -> VS (JavaCode FuncData)
jEqualsFunc VS (JavaCode Value)
v2)
        jEquality' CodeType
_ = VSUnOp JavaCode
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall (r :: * -> *) var val typ.
(OpElim r, RenderValue r var val typ, ValueElim r val) =>
VSBinOp r -> VS (r typ) -> VS (r val) -> VS (r val) -> VS (r val)
typeBinExpr VSUnOp JavaCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
equalOp VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
bool VS (JavaCode Value)
v1 VS (JavaCode Value)
v2

jLambda :: [r BinderD] -> r Value -> Doc
jLambda :: forall (r :: * -> *). [r BinderD] -> r Value -> Doc
jLambda = String -> [r BinderD] -> r Value -> Doc
forall a. HasCallStack => String -> a
error String
"Lambdas not supported in Java (yet). See #4956 for updates." -- \ps ex -> parens (binderList ps) <+> jLambdaSep <+> RC.value ex

jCast :: VS (JavaCode TypeData) -> VS (JavaCode Value) -> VS (JavaCode Value)
jCast :: VS (JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode Value)
jCast = StateT ValueState Identity (VS (JavaCode Value))
-> VS (JavaCode Value)
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (StateT ValueState Identity (VS (JavaCode Value))
 -> VS (JavaCode Value))
-> (VS (JavaCode TypeData)
    -> VS (JavaCode Value)
    -> StateT ValueState Identity (VS (JavaCode Value)))
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> VS (JavaCode Value)
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.: (JavaCode TypeData -> JavaCode Value -> VS (JavaCode Value))
-> VS (JavaCode TypeData)
-> VS (JavaCode Value)
-> StateT ValueState Identity (VS (JavaCode Value))
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues
  (\JavaCode TypeData
t JavaCode Value
v -> CodeType
-> CodeType
-> JavaCode TypeData
-> JavaCode Value
-> VS (JavaCode Value)
jCast' (JavaCode TypeData -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType JavaCode TypeData
t) (JavaCode TypeData -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType (JavaCode TypeData -> CodeType) -> JavaCode TypeData -> CodeType
forall a b. (a -> b) -> a -> b
$ JavaCode Value -> JavaCode TypeData
forall {k} (r :: k -> *) (val :: k) (typ :: k).
ValueSym r val typ =>
r val -> r typ
valueType JavaCode Value
v) JavaCode TypeData
t JavaCode Value
v)
  where jCast' :: CodeType
-> CodeType
-> JavaCode TypeData
-> JavaCode Value
-> VS (JavaCode Value)
jCast' CodeType
Double CodeType
String JavaCode TypeData
_ JavaCode Value
v = VS (JavaCode Value) -> VS (JavaCode Value)
jParseDblFunc (JavaCode Value -> VS (JavaCode Value)
forall a s. a -> State s a
toState JavaCode Value
v)
        jCast' CodeType
Float CodeType
String JavaCode TypeData
_ JavaCode Value
v = VS (JavaCode Value) -> VS (JavaCode Value)
jParseFloatFunc (JavaCode Value -> VS (JavaCode Value)
forall a s. a -> State s a
toState JavaCode Value
v)
        jCast' CodeType
_ CodeType
_ JavaCode TypeData
t JavaCode Value
v = VS (JavaCode TypeData) -> Doc -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r typ) -> Doc -> VS (r val)
mkStateVal (JavaCode TypeData -> VS (JavaCode TypeData)
forall a s. a -> State s a
toState JavaCode TypeData
t) (Doc -> Doc -> Doc
R.castObj (Doc -> Doc
R.cast (JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType JavaCode TypeData
t))
          (JavaCode Value -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value JavaCode Value
v))

jConstDecDef
  :: VS (JavaCode Variable)
  -> JavaCode ScopeData
  -> VS (JavaCode Value)
  -> MS (JavaCode Statement)
jConstDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
jConstDecDef VS (JavaCode Variable)
v' JavaCode ScopeData
scp VS (JavaCode Value)
def' = do
  v <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> VS (JavaCode Variable)
-> StateT MethodState Identity (JavaCode 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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS VS (JavaCode Variable)
v'
  def <- zoom lensMStoVS def'
  modify $ useVarName $ variableName v
  modify $ setVarScope (variableName v) (scopeData scp)
  mkStmt $ jFinal <+> renderType (variableType v) <+>
    RC.variable v <+> equals <+> RC.value def

jFuncDecDef
  :: VS (JavaCode Variable)
  -> JavaCode ScopeData
  -> [VS (JavaCode Variable)]
  -> MS (JavaCode Body)
  -> MS (JavaCode Statement)
jFuncDecDef :: VS (JavaCode Variable)
-> JavaCode ScopeData
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
jFuncDecDef VS (JavaCode Variable)
v JavaCode ScopeData
scp [VS (JavaCode Variable)]
ps MS (JavaCode Doc)
bod = do
  vr <- LensLike'
  (Zoomed (StateT ValueState Identity) (JavaCode Variable))
  MethodState
  ValueState
-> VS (JavaCode Variable)
-> StateT MethodState Identity (JavaCode 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) (JavaCode Variable))
  MethodState
  ValueState
(ValueState -> Focusing Identity (JavaCode Variable) ValueState)
-> MethodState -> Focusing Identity (JavaCode Variable) MethodState
Lens' MethodState ValueState
lensMStoVS VS (JavaCode Variable)
v
  modify $ useVarName $ variableName vr
  modify $ setVarScope (variableName vr) (scopeData scp)
  pms <- mapM (zoom lensMStoVS) ps
  b <- bod
  mkStmt $ renderType (variableType vr) <+> RC.variable vr <+> equals <+>
    parens (variableList pms) <+> jLambdaSep <+> bodyStart $$ indent (RC.body b)
    $$ bodyEnd

jThrowDoc :: (ValueElim r val) => r val -> Doc
jThrowDoc :: forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
jThrowDoc r val
errMsg = Doc
throwLabel Doc -> Doc -> Doc
<+> Doc
new' Doc -> Doc -> Doc
<+> Doc
exceptionObj' Doc -> Doc -> Doc
<>
  Doc -> Doc
parens (r val -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value r val
errMsg)

jTryCatch :: (BodyElim r bod) => r bod -> r bod -> Doc
jTryCatch :: forall {k} (r :: k -> *) (bod :: k).
BodyElim r bod =>
r bod -> r bod -> Doc
jTryCatch r bod
tb r bod
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
$ r bod -> Doc
forall {k} (r :: k -> *) (bod :: k). BodyElim r bod => r bod -> Doc
RC.body r bod
tb,
  Doc
rbrace Doc -> Doc -> Doc
<+> Doc
catchLabel Doc -> Doc -> Doc
<+> Doc -> Doc
parens (Doc
exceptionObj' Doc -> Doc -> Doc
<+> String -> Doc
text String
"exc") Doc -> Doc -> Doc
<+>
    Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ r bod -> Doc
forall {k} (r :: k -> *) (bod :: k). BodyElim r bod => r bod -> Doc
RC.body r bod
cb,
  Doc
rbrace]

jAssert :: (ValueElim r val) => r val -> r val -> Doc
jAssert :: forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> r val -> Doc
jAssert r val
condition r val
errorMessage = [Doc] -> Doc
vcat [
  String -> Doc
text String
"assert" Doc -> Doc -> Doc
<+> r val -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value r val
condition Doc -> Doc -> Doc
<+> Doc
colon Doc -> Doc -> Doc
<+> r val -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value r val
errorMessage
  ]

jOut
  ::
    ( BodySym r bod block
    , BlockSym r block stmt
    , TypeSym r typ
    , ValueSym r val typ
    , Literal r val typ
    , Comparison r val
    , NumericExpression r val
    , ValueExpression r var val binder typ
    , VariableSym r var typ
    , VariableValue r var val
    , List r val
    , ScopeSym r scope
    , MultiStatement r stmt
    , DeclStatement r bod stmt var scope val
    , AssignStatement r stmt var val
    , ControlStatement r bod stmt var val
    , PrintConsole r stmt val
    , PrintFile r stmt val
    , InternalIOStmt r stmt val
    , TypeElim r typ
    )
  => Bool -> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut :: forall {k} (r :: k -> *) (bod :: k) (block :: k) (stmt :: k)
       (typ :: k) (val :: k) (var :: k) (binder :: k) (scope :: k).
(BodySym r bod block, BlockSym r block stmt, TypeSym r typ,
 ValueSym r val typ, Literal r val typ, Comparison r val,
 NumericExpression r val, ValueExpression r var val binder typ,
 VariableSym r var typ, VariableValue r var val, List r val,
 ScopeSym r scope, MultiStatement r stmt,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, PrintConsole r stmt val,
 PrintFile r stmt val, InternalIOStmt r stmt val, TypeElim r typ) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
jOut Bool
newLn Maybe (VS (r val))
f VS (r val)
printFn VS (r val)
v = LensLike'
  (Zoomed (StateT ValueState Identity) (r val))
  MethodState
  ValueState
-> VS (r val) -> StateT MethodState Identity (r val)
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 val))
  MethodState
  ValueState
(ValueState -> Focusing Identity (r val) ValueState)
-> MethodState -> Focusing Identity (r val) MethodState
Lens' MethodState ValueState
lensMStoVS VS (r val)
v StateT MethodState Identity (r val)
-> (r val -> StateT MethodState Identity (r stmt))
-> StateT MethodState Identity (r stmt)
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 stmt)
jOut' (CodeType -> StateT MethodState Identity (r stmt))
-> (r val -> CodeType)
-> r val
-> StateT MethodState Identity (r stmt)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r typ -> CodeType
forall {k} (r :: k -> *) (typ :: k).
TypeElim r typ =>
r typ -> CodeType
getCodeType (r typ -> CodeType) -> (r val -> r typ) -> r val -> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r val -> r typ
forall {k} (r :: k -> *) (val :: k) (typ :: k).
ValueSym r val typ =>
r val -> r typ
valueType
  where jOut' :: CodeType -> StateT MethodState Identity (r stmt)
jOut' (List (Object String
_)) = Bool
-> Maybe (VS (r val))
-> VS (r val)
-> VS (r val)
-> StateT MethodState Identity (r stmt)
forall {k} (r :: k -> *) (block :: k) (stmt :: k) (bod :: k)
       (val :: k) (scope :: k) (var :: k) (typ :: k).
(BlockSym r block stmt, BodySym r bod block, MultiStatement r stmt,
 PrintConsole r stmt val, PrintFile r stmt val, ScopeSym r scope,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, ValueSym r val typ,
 Literal r val typ, NumericExpression r val, Comparison r val,
 VariableSym r var typ, VariableValue r var val, List r val,
 TypeSym r typ, TypeElim r typ, InternalIOStmt r stmt val) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
G.print Bool
newLn Maybe (VS (r val))
f VS (r val)
printFn VS (r val)
v
        jOut' (List CodeType
_) = Bool
-> Maybe (VS (r val))
-> VS (r val)
-> VS (r val)
-> StateT MethodState Identity (r stmt)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
InternalIOStmt r stmt val =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
printSt Bool
newLn Maybe (VS (r val))
f VS (r val)
printFn VS (r val)
v
        jOut' (Array CodeType
_) = do
          LensLike'
  (Zoomed (StateT ValueState Identity) ()) MethodState ValueState
-> StateT ValueState Identity () -> StateT MethodState Identity ()
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) ()) MethodState ValueState
Lens' MethodState ValueState
lensMStoVS (StateT ValueState Identity () -> StateT MethodState Identity ())
-> StateT ValueState Identity () -> StateT MethodState Identity ()
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 -> ValueState -> ValueState)
-> String -> ValueState -> ValueState
forall a b. (a -> b) -> a -> b
$ String -> String
utilImport String
jArrays)
          Bool
-> Maybe (VS (r val))
-> VS (r val)
-> VS (r val)
-> StateT MethodState Identity (r stmt)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
InternalIOStmt r stmt val =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
printSt Bool
newLn Maybe (VS (r val))
f VS (r val)
printFn (String -> PosCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (binder :: k)
       (typ :: k).
ValueExpression r var val binder typ =>
String -> PosCall r val typ
extFuncApp String
jArrays String
"toString" VS (r typ)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
string [VS (r val)
v])
        jOut' CodeType
_ = Bool
-> Maybe (VS (r val))
-> VS (r val)
-> VS (r val)
-> StateT MethodState Identity (r stmt)
forall {k} (r :: k -> *) (block :: k) (stmt :: k) (bod :: k)
       (val :: k) (scope :: k) (var :: k) (typ :: k).
(BlockSym r block stmt, BodySym r bod block, MultiStatement r stmt,
 PrintConsole r stmt val, PrintFile r stmt val, ScopeSym r scope,
 DeclStatement r bod stmt var scope val,
 AssignStatement r stmt var val,
 ControlStatement r bod stmt var val, ValueSym r val typ,
 Literal r val typ, NumericExpression r val, Comparison r val,
 VariableSym r var typ, VariableValue r var val, List r val,
 TypeSym r typ, TypeElim r typ, InternalIOStmt r stmt val) =>
Bool
-> Maybe (VS (r val)) -> VS (r val) -> VS (r val) -> MS (r stmt)
G.print Bool
newLn Maybe (VS (r val))
f VS (r val)
printFn VS (r val)
v

jDiscardInput :: VS (JavaCode Value) -> MS (JavaCode Statement)
jDiscardInput :: VS (JavaCode Value) -> MS (JavaCode Statement)
jDiscardInput VS (JavaCode Value)
inFn = VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
ValueStatement r stmt val =>
VS (r val) -> MS (r stmt)
valStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextFunc

jInput :: VS (JavaCode Variable) -> VS (JavaCode Value) -> VS (JavaCode Value)
jInput :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> VS (JavaCode Value)
jInput VS (JavaCode Variable)
vr VS (JavaCode Value)
inFn = do
  v <- VS (JavaCode Variable)
vr
  let jInput' CodeType
Integer = VS (JavaCode Value) -> VS (JavaCode Value)
jParseIntFunc (VS (JavaCode Value) -> VS (JavaCode Value))
-> VS (JavaCode Value) -> VS (JavaCode Value)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Float = VS (JavaCode Value) -> VS (JavaCode Value)
jParseFloatFunc (VS (JavaCode Value) -> VS (JavaCode Value))
-> VS (JavaCode Value) -> VS (JavaCode Value)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Double = VS (JavaCode Value) -> VS (JavaCode Value)
jParseDblFunc (VS (JavaCode Value) -> VS (JavaCode Value))
-> VS (JavaCode Value) -> VS (JavaCode Value)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Boolean = VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextBoolFunc
      jInput' CodeType
String = VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextLineFunc
      jInput' CodeType
Char = (VS (JavaCode Value)
inFn VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jNextFunc) VS (JavaCode Value)
-> VS (JavaCode FuncData) -> VS (JavaCode Value)
forall (r :: * -> *) val typ.
OOFunctionSym r val typ =>
VS (r val) -> VS (r FuncData) -> VS (r val)
$. VS (JavaCode FuncData)
jCharAtFunc
      jInput' CodeType
_ = String -> VS (JavaCode Value)
forall a. HasCallStack => String -> a
error String
"Attempt to read value of unreadable type"
  jInput' (getCodeType $ variableType v)

jOpenFileR
  :: (OOTypeSym r typ, OOValueExpression r var val typ)
  => VS (r val) -> VS (r typ) -> VS (r val)
jOpenFileR :: forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(OOTypeSym r typ, OOValueExpression r var val typ) =>
VS (r val) -> VS (r typ) -> VS (r val)
jOpenFileR VS (r val)
n VS (r typ)
t = PosCtorCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj VS (r typ)
t [PosCtorCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj VS (r typ)
forall {k} (r :: k -> *) (typ :: k). OOTypeSym r typ => VS (r typ)
jFileType [VS (r val)
n]]

jOpenFileWorA
  :: (OOTypeSym r typ, OOValueExpression r var val typ)
  => VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val)
jOpenFileWorA :: forall {k} (r :: k -> *) (typ :: k) (var :: k) (val :: k).
(OOTypeSym r typ, OOValueExpression r var val typ) =>
VS (r val) -> VS (r typ) -> VS (r val) -> VS (r val)
jOpenFileWorA VS (r val)
n VS (r typ)
t VS (r val)
wa = PosCtorCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj VS (r typ)
t
  [PosCtorCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj VS (r typ)
forall {k} (r :: k -> *) (typ :: k). OOTypeSym r typ => VS (r typ)
jFileWriterType [PosCtorCall r val typ
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
OOValueExpression r var val typ =>
PosCtorCall r val typ
newObj VS (r typ)
forall {k} (r :: k -> *) (typ :: k). OOTypeSym r typ => VS (r typ)
jFileType [VS (r val)
n], VS (r val)
wa]]

jStringSplit :: VS (JavaCode Variable) -> VS (JavaCode Value) -> VS Doc
jStringSplit :: VS (JavaCode Variable)
-> VS (JavaCode Value) -> StateT ValueState Identity Doc
jStringSplit = (JavaCode Variable -> JavaCode Value -> Doc)
-> VS (JavaCode Variable)
-> VS (JavaCode Value)
-> StateT ValueState Identity Doc
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues (\JavaCode Variable
vnew JavaCode Value
s -> JavaCode Variable -> Doc
forall {k} (r :: k -> *) (var :: k).
InternalVarElim r var =>
r var -> Doc
RC.variable JavaCode Variable
vnew Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<+>
  Doc
new' Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType (JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType JavaCode Variable
vnew) Doc -> Doc -> Doc
<> Doc -> Doc
parens (JavaCode Value -> Doc
forall {k} (r :: k -> *) (val :: k).
ValueElim r val =>
r val -> Doc
RC.value JavaCode Value
s))

jMethod :: Label -> [String] -> JavaCode Doc ->
  JavaCode Doc -> JavaCode TypeData ->
  [JavaCode ParamData] -> JavaCode Body -> Doc
jMethod :: String
-> [String]
-> JavaCode Doc
-> JavaCode Doc
-> JavaCode TypeData
-> [JavaCode ParamData]
-> JavaCode Doc
-> Doc
jMethod String
n [String]
es JavaCode Doc
s JavaCode Doc
p JavaCode TypeData
t [JavaCode ParamData]
ps JavaCode Doc
b = [Doc] -> Doc
vcat [
  JavaCode Doc -> Doc
forall {k} (r :: k -> *) (vis :: k).
VisibilityElim r vis =>
r vis -> Doc
RC.visibility JavaCode Doc
s Doc -> Doc -> Doc
<+> JavaCode Doc -> Doc
forall {k} (r :: k -> *) (attch :: k).
PermElim r attch =>
r attch -> Doc
RC.perm JavaCode Doc
p Doc -> Doc -> Doc
<+> JavaCode TypeData -> Doc
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> Doc
renderType JavaCode TypeData
t Doc -> Doc -> Doc
<+> String -> Doc
text String
n Doc -> Doc -> Doc
<>
    Doc -> Doc
parens ([JavaCode ParamData] -> Doc
forall {k} (r :: k -> *) (param :: k) (typ :: k).
ParamElim r param typ =>
[r param] -> Doc
parameterList [JavaCode ParamData]
ps) Doc -> Doc -> Doc
<+> [String] -> Doc -> Doc
forall a. [a] -> Doc -> Doc
emptyIfNull [String]
es (Doc
throwsLabel Doc -> Doc -> Doc
<+>
    String -> Doc
text (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
listSep ([String] -> [String]
forall a. Ord a => [a] -> [a]
sort [String]
es))) Doc -> Doc -> Doc
<+> Doc
lbrace,
  Doc -> Doc
indent (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ JavaCode Doc -> Doc
forall {k} (r :: k -> *) (bod :: k). BodyElim r bod => r bod -> Doc
RC.body JavaCode Doc
b,
  Doc
rbrace]

outputs :: VS (JavaCode Variable)
outputs :: VS (JavaCode Variable)
outputs = String -> VS (JavaCode TypeData) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableSym r var typ =>
String -> VS (r typ) -> VS (r var)
var String
"outputs" VS (JavaCode TypeData)
jArrayType

jAssignFromArray
  :: Integer -> [VS (JavaCode Variable)] -> [MS (JavaCode Statement)]
jAssignFromArray :: Integer -> [VS (JavaCode Variable)] -> [MS (JavaCode Statement)]
jAssignFromArray Integer
_ [] = []
jAssignFromArray Integer
c (VS (JavaCode Variable)
v:[VS (JavaCode Variable)]
vs) = (VS (JavaCode Variable)
v VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
&= VS (JavaCode TypeData)
-> VS (JavaCode Value) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k) (typ :: k).
RenderValue r var val typ =>
VS (r typ) -> VS (r val) -> VS (r val)
cast ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
v)
  (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf (VS (JavaCode Variable) -> VS (JavaCode Value))
-> VS (JavaCode Variable) -> VS (JavaCode Value)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Value)
-> VS (JavaCode Value) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (val :: k).
Array r var val =>
VS (r val) -> VS (r val) -> VS (r var)
arrayElem (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
outputs) (Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
c))) MS (JavaCode Statement)
-> [MS (JavaCode Statement)] -> [MS (JavaCode Statement)]
forall a. a -> [a] -> [a]
: Integer -> [VS (JavaCode Variable)] -> [MS (JavaCode Statement)]
jAssignFromArray (Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1) [VS (JavaCode Variable)]
vs

jInOutCall
  :: (Label -> VS (JavaCode TypeData) -> [VS (JavaCode Value)] -> VS (JavaCode Value))
  -> Label
  -> [VS (JavaCode Value)]
  -> [VS (JavaCode Variable)]
  -> [VS (JavaCode Variable)]
  -> MS (JavaCode Statement)
jInOutCall :: (String
 -> VS (JavaCode TypeData)
 -> [VS (JavaCode Value)]
 -> VS (JavaCode Value))
-> InOutCall JavaCode Statement Variable Value
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n [VS (JavaCode Value)]
ins [] [] = VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (val :: k).
ValueStatement r stmt val =>
VS (r val) -> MS (r stmt)
valStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void [VS (JavaCode Value)]
ins
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n [VS (JavaCode Value)]
ins [VS (JavaCode Variable)
out] [] = VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
assign VS (JavaCode Variable)
out (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
out)
  [VS (JavaCode Value)]
ins
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n [VS (JavaCode Value)]
ins [] [VS (JavaCode Variable)
out] = VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
assign VS (JavaCode Variable)
out (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
out)
  (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
out VS (JavaCode Value)
-> [VS (JavaCode Value)] -> [VS (JavaCode Value)]
forall a. a -> [a] -> [a]
: [VS (JavaCode Value)]
ins)
jInOutCall String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n [VS (JavaCode Value)]
ins [VS (JavaCode Variable)]
outs [VS (JavaCode Variable)]
both = [VS (JavaCode Variable)] -> MS (JavaCode Statement)
fCall [VS (JavaCode Variable)]
rets
  where rets :: [VS (JavaCode Variable)]
rets = [VS (JavaCode Variable)]
both [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)] -> [VS (JavaCode Variable)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Variable)]
outs
        fCall :: [VS (JavaCode Variable)] -> MS (JavaCode Statement)
fCall [VS (JavaCode Variable)
x] = VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
assign VS (JavaCode Variable)
x (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
x)
          ((VS (JavaCode Variable) -> VS (JavaCode Value))
-> [VS (JavaCode Variable)] -> [VS (JavaCode Value)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf [VS (JavaCode Variable)]
both [VS (JavaCode Value)]
-> [VS (JavaCode Value)] -> [VS (JavaCode Value)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Value)]
ins)
        fCall [VS (JavaCode Variable)]
xs = MS Bool
isOutputsDeclared MS Bool
-> (Bool -> MS (JavaCode Statement)) -> MS (JavaCode Statement)
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
>>= (\Bool
odec -> (MethodState -> MethodState) -> StateT MethodState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify MethodState -> MethodState
setOutputsDeclared StateT MethodState Identity ()
-> MS (JavaCode Statement) -> MS (JavaCode Statement)
forall a b.
StateT MethodState Identity a
-> StateT MethodState Identity b -> StateT MethodState Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
          [MS (JavaCode Statement)] -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
MultiStatement r stmt =>
[MS (r stmt)] -> MS (r stmt)
multi ((if Bool
odec then VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
assign else (VS (JavaCode Variable)
-> JavaCode ScopeData
-> VS (JavaCode Value)
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> VS (r val) -> MS (r stmt)
`varDecDef` JavaCode ScopeData
forall {k} (r :: k -> *) (scope :: k). ScopeSym r scope => r scope
local)) VS (JavaCode Variable)
outputs
          (String
-> VS (JavaCode TypeData)
-> [VS (JavaCode Value)]
-> VS (JavaCode Value)
f String
n VS (JavaCode TypeData)
jArrayType ((VS (JavaCode Variable) -> VS (JavaCode Value))
-> [VS (JavaCode Variable)] -> [VS (JavaCode Value)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf [VS (JavaCode Variable)]
both [VS (JavaCode Value)]
-> [VS (JavaCode Value)] -> [VS (JavaCode Value)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Value)]
ins)) MS (JavaCode Statement)
-> [MS (JavaCode Statement)] -> [MS (JavaCode Statement)]
forall a. a -> [a] -> [a]
: Integer -> [VS (JavaCode Variable)] -> [MS (JavaCode Statement)]
jAssignFromArray Integer
0 [VS (JavaCode Variable)]
xs))

jInOut
  :: (VS (JavaCode TypeData) -> [MS (JavaCode ParamData)] -> MS (JavaCode Body) -> MS (JavaCode mthd))
  -> [VS (JavaCode Variable)]
  -> [VS (JavaCode Variable)]
  -> [VS (JavaCode Variable)]
  -> MS (JavaCode Body)
  -> MS (JavaCode mthd)
jInOut :: forall mthd.
(VS (JavaCode TypeData)
 -> [MS (JavaCode ParamData)]
 -> MS (JavaCode Doc)
 -> MS (JavaCode mthd))
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f [VS (JavaCode Variable)]
ins [] [] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f VS (JavaCode TypeData)
forall {k} (r :: k -> *) (typ :: k). TypeSym r typ => VS (r typ)
void (VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k).
ParameterSym r param var =>
VS (r var) -> MS (r param)
param (VS (JavaCode Variable) -> MS (JavaCode ParamData))
-> [VS (JavaCode Variable)] -> [MS (JavaCode ParamData)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VS (JavaCode Variable)]
ins) MS (JavaCode Doc)
b
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f [VS (JavaCode Variable)]
ins [VS (JavaCode Variable)
v] [] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
v) (VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k).
ParameterSym r param var =>
VS (r var) -> MS (r param)
param (VS (JavaCode Variable) -> MS (JavaCode ParamData))
-> [VS (JavaCode Variable)] -> [MS (JavaCode ParamData)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VS (JavaCode Variable)]
ins)
  ((JavaCode Statement
 -> JavaCode Doc -> JavaCode Statement -> JavaCode Doc)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
forall a b c d s.
(a -> b -> c -> d)
-> State s a -> State s b -> State s c -> State s d
on3StateValues ((Statement -> Doc -> Statement -> Doc)
-> JavaCode Statement
-> JavaCode Doc
-> JavaCode Statement
-> JavaCode Doc
forall (r :: * -> *) a b c d.
Applicative r =>
(a -> b -> c -> d) -> r a -> r b -> r c -> r d
on3CodeValues Statement -> Doc -> Statement -> Doc
surroundBody) (VS (JavaCode Variable)
-> JavaCode ScopeData -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> MS (r stmt)
varDec VS (JavaCode Variable)
v JavaCode ScopeData
forall {k} (r :: k -> *) (scope :: k). ScopeSym r scope => r scope
local) MS (JavaCode Doc)
b (VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
VS (r val) -> MS (r stmt)
returnStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$
  VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
v))
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f [VS (JavaCode Variable)]
ins [] [VS (JavaCode Variable)
v] MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f ((JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
v)
  (VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k).
ParameterSym r param var =>
VS (r var) -> MS (r param)
param (VS (JavaCode Variable) -> MS (JavaCode ParamData))
-> [VS (JavaCode Variable)] -> [MS (JavaCode ParamData)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> VS (JavaCode Variable)
v VS (JavaCode Variable)
-> [VS (JavaCode Variable)] -> [VS (JavaCode Variable)]
forall a. a -> [a] -> [a]
: [VS (JavaCode Variable)]
ins) ((JavaCode Doc -> JavaCode Statement -> JavaCode Doc)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((Doc -> Statement -> Doc)
-> JavaCode Doc -> JavaCode Statement -> JavaCode Doc
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues Doc -> Statement -> Doc
appendToBody) MS (JavaCode Doc)
b
  (VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
VS (r val) -> MS (r stmt)
returnStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
v))
jInOut VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f [VS (JavaCode Variable)]
ins [VS (JavaCode Variable)]
outs [VS (JavaCode Variable)]
both MS (JavaCode Doc)
b = VS (JavaCode TypeData)
-> [MS (JavaCode ParamData)]
-> MS (JavaCode Doc)
-> MS (JavaCode mthd)
f ([VS (JavaCode Variable)] -> VS (JavaCode TypeData)
returnTp [VS (JavaCode Variable)]
rets)
  (VS (JavaCode Variable) -> MS (JavaCode ParamData)
forall {k} (r :: k -> *) (param :: k) (var :: k).
ParameterSym r param var =>
VS (r var) -> MS (r param)
param (VS (JavaCode Variable) -> MS (JavaCode ParamData))
-> [VS (JavaCode Variable)] -> [MS (JavaCode ParamData)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VS (JavaCode Variable)]
both [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)] -> [VS (JavaCode Variable)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Variable)]
ins) ((JavaCode Statement
 -> JavaCode Doc -> JavaCode Statement -> JavaCode Doc)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
-> MS (JavaCode Statement)
-> MS (JavaCode Doc)
forall a b c d s.
(a -> b -> c -> d)
-> State s a -> State s b -> State s c -> State s d
on3StateValues ((Statement -> Doc -> Statement -> Doc)
-> JavaCode Statement
-> JavaCode Doc
-> JavaCode Statement
-> JavaCode Doc
forall (r :: * -> *) a b c d.
Applicative r =>
(a -> b -> c -> d) -> r a -> r b -> r c -> r d
on3CodeValues Statement -> Doc -> Statement -> Doc
surroundBody) MS (JavaCode Statement)
decls
  MS (JavaCode Doc)
b ([VS (JavaCode Variable)] -> MS (JavaCode Statement)
returnSt [VS (JavaCode Variable)]
rets))
  where returnTp :: [VS (JavaCode Variable)] -> VS (JavaCode TypeData)
returnTp [VS (JavaCode Variable)
x] = (JavaCode Variable -> JavaCode TypeData)
-> VS (JavaCode Variable) -> VS (JavaCode TypeData)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue JavaCode Variable -> JavaCode TypeData
forall {k} (r :: k -> *) (var :: k) (typ :: k).
VariableElim r var typ =>
r var -> r typ
variableType VS (JavaCode Variable)
x
        returnTp [VS (JavaCode Variable)]
_ = VS (JavaCode TypeData)
jArrayType
        returnSt :: [VS (JavaCode Variable)] -> MS (JavaCode Statement)
returnSt [VS (JavaCode Variable)
x] = VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
VS (r val) -> MS (r stmt)
returnStmt (VS (JavaCode Value) -> MS (JavaCode Statement))
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
x
        returnSt [VS (JavaCode Variable)]
_ = [MS (JavaCode Statement)] -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
MultiStatement r stmt =>
[MS (r stmt)] -> MS (r stmt)
multi (Integer
-> VS (JavaCode Value)
-> VS (JavaCode Variable)
-> JavaCode ScopeData
-> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
Integer -> VS (r val) -> VS (r var) -> r scope -> MS (r stmt)
arrayDec (Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ [VS (JavaCode Variable)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [VS (JavaCode Variable)]
rets) VS (JavaCode Value)
forall a. HasCallStack => a
undefined VS (JavaCode Variable)
outputs JavaCode ScopeData
forall {k} (r :: k -> *) (scope :: k). ScopeSym r scope => r scope
local
          MS (JavaCode Statement)
-> [MS (JavaCode Statement)] -> [MS (JavaCode Statement)]
forall a. a -> [a] -> [a]
: Integer -> [VS (JavaCode Value)] -> [MS (JavaCode Statement)]
assignArray Integer
0 (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf (VS (JavaCode Variable) -> VS (JavaCode Value))
-> [VS (JavaCode Variable)] -> [VS (JavaCode Value)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VS (JavaCode Variable)]
rets)
          [MS (JavaCode Statement)]
-> [MS (JavaCode Statement)] -> [MS (JavaCode Statement)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (val :: k).
ControlStatement r bod stmt var val =>
VS (r val) -> MS (r stmt)
returnStmt (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
outputs)])
        assignArray
          :: Integer
          -> [VS (JavaCode Value)]
          -> [MS (JavaCode Statement)]
        assignArray :: Integer -> [VS (JavaCode Value)] -> [MS (JavaCode Statement)]
assignArray Integer
_ [] = []
        assignArray Integer
c (VS (JavaCode Value)
v:[VS (JavaCode Value)]
vs) =
          (VS (JavaCode Value)
-> VS (JavaCode Value) -> VS (JavaCode Variable)
forall {k} (r :: k -> *) (var :: k) (val :: k).
Array r var val =>
VS (r val) -> VS (r val) -> VS (r var)
arrayElem (VS (JavaCode Variable) -> VS (JavaCode Value)
forall {k} (r :: k -> *) (var :: k) (val :: k).
VariableValue r var val =>
VS (r var) -> VS (r val)
valueOf VS (JavaCode Variable)
outputs) (Integer -> VS (JavaCode Value)
forall {k} (r :: k -> *) (val :: k) (typ :: k).
Literal r val typ =>
Integer -> VS (r val)
litInt Integer
c) VS (JavaCode Variable)
-> VS (JavaCode Value) -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k) (var :: k) (val :: k).
AssignStatement r stmt var val =>
VS (r var) -> VS (r val) -> MS (r stmt)
&= VS (JavaCode Value)
v)
          MS (JavaCode Statement)
-> [MS (JavaCode Statement)] -> [MS (JavaCode Statement)]
forall a. a -> [a] -> [a]
: Integer -> [VS (JavaCode Value)] -> [MS (JavaCode Statement)]
assignArray (Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1) [VS (JavaCode Value)]
vs
        decls :: MS (JavaCode Statement)
decls = [MS (JavaCode Statement)] -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (stmt :: k).
MultiStatement r stmt =>
[MS (r stmt)] -> MS (r stmt)
multi ([MS (JavaCode Statement)] -> MS (JavaCode Statement))
-> [MS (JavaCode Statement)] -> MS (JavaCode Statement)
forall a b. (a -> b) -> a -> b
$ (VS (JavaCode Variable)
-> JavaCode ScopeData -> MS (JavaCode Statement)
forall {k} (r :: k -> *) (bod :: k) (stmt :: k) (var :: k)
       (scope :: k) (val :: k).
DeclStatement r bod stmt var scope val =>
VS (r var) -> r scope -> MS (r stmt)
`varDec` JavaCode ScopeData
forall {k} (r :: k -> *) (scope :: k). ScopeSym r scope => r scope
local) (VS (JavaCode Variable) -> MS (JavaCode Statement))
-> [VS (JavaCode Variable)] -> [MS (JavaCode Statement)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [VS (JavaCode Variable)]
outs
        rets :: [VS (JavaCode Variable)]
rets = [VS (JavaCode Variable)]
both [VS (JavaCode Variable)]
-> [VS (JavaCode Variable)] -> [VS (JavaCode Variable)]
forall a. Semigroup a => a -> a -> a
P.<> [VS (JavaCode Variable)]
outs

jDocInOut
  :: (BlockCommentSym r, RenderMethod r mthd)
  => ([VS (r Variable)] -> [VS (r Variable)] -> [VS (r Variable)] -> MS (r Body) -> MS (r mthd))
  -> String
  -> [(String, VS (r Variable))]
  -> [(String, VS (r Variable))]
  -> [(String, VS (r Variable))]
  -> MS (r Body)
  -> MS (r mthd)
jDocInOut :: forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
([VS (r Variable)]
 -> [VS (r Variable)]
 -> [VS (r Variable)]
 -> MS (r Doc)
 -> MS (r mthd))
-> String
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> [(String, VS (r Variable))]
-> MS (r Doc)
-> MS (r mthd)
jDocInOut [VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f String
desc [(String, VS (r Variable))]
is [] [] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
docFuncRepr FuncDocRenderer
functionDox String
desc ((String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is) []
  ([VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is) [] [] MS (r Doc)
b)
jDocInOut [VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f String
desc [(String, VS (r Variable))]
is [(String, VS (r Variable))
o] [] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
docFuncRepr FuncDocRenderer
functionDox String
desc ((String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is)
  [(String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst (String, VS (r Variable))
o] ([VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is) [(String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd (String, VS (r Variable))
o] [] MS (r Doc)
b)
jDocInOut [VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f String
desc [(String, VS (r Variable))]
is [] [(String, VS (r Variable))
both] MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
docFuncRepr FuncDocRenderer
functionDox String
desc ((String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((String, VS (r Variable))
both (String, VS (r Variable))
-> [(String, VS (r Variable))] -> [(String, VS (r Variable))]
forall a. a -> [a] -> [a]
:
  [(String, VS (r Variable))]
is)) [(String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst (String, VS (r Variable))
both] ([VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is) [] [(String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd (String, VS (r Variable))
both] MS (r Doc)
b)
jDocInOut [VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f String
desc [(String, VS (r Variable))]
is [(String, VS (r Variable))]
os [(String, VS (r Variable))]
bs MS (r Doc)
b = FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
forall (r :: * -> *) mthd.
(BlockCommentSym r, RenderMethod r mthd) =>
FuncDocRenderer
-> String -> [String] -> [String] -> MS (r mthd) -> MS (r mthd)
docFuncRepr  FuncDocRenderer
functionDox String
desc ((String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
bs [(String, VS (r Variable))]
-> [(String, VS (r Variable))] -> [(String, VS (r Variable))]
forall a. Semigroup a => a -> a -> a
P.<> [(String, VS (r Variable))]
is)
  [String]
rets ([VS (r Variable)]
-> [VS (r Variable)]
-> [VS (r Variable)]
-> MS (r Doc)
-> MS (r mthd)
f ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
is) ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
os) ((String, VS (r Variable)) -> VS (r Variable)
forall a b. (a, b) -> b
snd ((String, VS (r Variable)) -> VS (r Variable))
-> [(String, VS (r Variable))] -> [VS (r Variable)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(String, VS (r Variable))]
bs) MS (r Doc)
b)
  where rets :: [String]
rets = String
"array containing the following values:" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst [(String, VS (r Variable))]
bs [String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
P.<>
          ((String, VS (r Variable)) -> String)
-> [(String, VS (r Variable))] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String, VS (r Variable)) -> String
forall a b. (a, b) -> a
fst [(String, VS (r Variable))]
os

jExtraClass
  :: (RenderClass r cls stvr mthd vis, RenderVisibility r vis)
  => Label
  -> Maybe Label
  -> [CSStateVar r stvr]
  -> [MS (r mthd)]
  -> [MS (r mthd)]
  -> CS (r cls)
jExtraClass :: forall (r :: * -> *) cls stvr mthd vis.
(RenderClass r cls stvr mthd vis, RenderVisibility r vis) =>
String
-> Maybe String
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
jExtraClass String
n = String
-> r vis
-> r Doc
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
forall (r :: * -> *) cls stvr mthd vis.
RenderClass r cls stvr mthd vis =>
String
-> r vis
-> r Doc
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
intClass String
n (VisibilityTag -> Doc -> r vis
forall {k} (r :: k -> *) (vis :: k).
RenderVisibility r vis =>
VisibilityTag -> Doc -> r vis
visibilityFromData VisibilityTag
Priv Doc
empty) (r Doc
 -> [CSStateVar r stvr]
 -> [MS (r mthd)]
 -> [MS (r mthd)]
 -> CS (r cls))
-> (Maybe String -> r Doc)
-> Maybe String
-> [CSStateVar r stvr]
-> [MS (r mthd)]
-> [MS (r mthd)]
-> CS (r cls)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe String -> r Doc
forall (r :: * -> *) cls stvr mthd vis.
RenderClass r cls stvr mthd vis =>
Maybe String -> r Doc
inherit

addCallExcsCurrMod :: String -> VS ()
addCallExcsCurrMod :: String -> StateT ValueState Identity ()
addCallExcsCurrMod String
n = do
  cm <- LensLike'
  (Zoomed (StateT FileState Identity) String) ValueState FileState
-> StateT FileState Identity String
-> StateT ValueState Identity String
forall c.
LensLike'
  (Zoomed (StateT FileState Identity) c) ValueState FileState
-> StateT FileState Identity c -> StateT ValueState 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) String) ValueState FileState
(FileState -> Focusing Identity String FileState)
-> ValueState -> Focusing Identity String ValueState
Lens' ValueState FileState
lensVStoFS StateT FileState Identity String
getModuleName
  mem <- getMethodExcMap
  modify (maybe id addExceptions (Map.lookup (qualName cm n) mem))

addConstructorCallExcsCurrMod
  :: (UnRepr r TypeData)
  => VS (r TypeData) -> (VS (r TypeData) -> VS (r Value)) -> VS (r Value)
addConstructorCallExcsCurrMod :: forall (r :: * -> *).
UnRepr r TypeData =>
VS (r TypeData)
-> (VS (r TypeData) -> VS (r Value)) -> VS (r Value)
addConstructorCallExcsCurrMod VS (r TypeData)
ot VS (r TypeData) -> VS (r Value)
f = do
  t <- VS (r TypeData)
ot
  cm <- zoom lensVStoFS getModuleName
  mem <- getMethodExcMap
  let tp = r TypeData -> String
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> String
getTypeString r TypeData
t
  modify (maybe id addExceptions (Map.lookup (qualName cm tp) mem))
  f (pure t)