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

-- | The logic to render MATLAB code is contained in this module.
module Drasil.GProc.LanguageRenderer.MatlabRenderer (
  -- * MATLAB Code Configuration -- defines syntax of all MATLAB code
  MatlabCode(..), mlName, mlVersion
) where

import Drasil.Shared.InterfaceCommon (Label, VSType, SValue, SVariable,
  MSStatement, getCodeType,
  UnRepr(..), SharedProg, BodySym(..),
  BlockSym(..), TypeSym(..), VariableSym(..), VariableElim(..), ValueSym(..),
  Argument(..), Literal(..), MathConstant(..), VariableValue(..),
  CommandLineArgs(..), NumericExpression(..), BooleanExpression(..),
  Comparison(..), ValueExpression(..), IndexTranslator(..),
  Reference(..), Array(..), List(..), Set(..), InternalList(..),
  StatementSym(..), AssignStatement(..), DeclStatement(..), IOStatement(..),
  StringStatement(..), FunctionSym(..), FuncAppStatement(..),
  CommentStatement(..), ControlStatement(..), VisibilitySym(..), ScopeSym(..),
  ParameterSym(..), BinderSym(..), BinderElim(..), MethodSym(..), funcApp,
  (&=))
import Drasil.GProc.InterfaceProc (ProcProg, ProgramSym(..),
  FileSym(..), ModuleSym(..))

import Drasil.Shared.RendererClassesCommon (CommonRenderSym, ImportSym(..),
  RenderBody(..), BodyElim, RenderBlock(..), BlockElim, RenderType(..),
  UnaryOpSym(..), BinaryOpSym(..), OpElim(uOpPrec, bOpPrec), RenderVariable(..),
  InternalVarElim(variableBind), RenderValue(..), ValueElim(..),
  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.GProc.RendererClassesProc (ProcRenderSym, RenderFile(..),
  RenderMod(..), ModuleElim, ProcRenderMethod(..))
import qualified Drasil.GProc.LanguageRenderer.AbstractProc as A (fileDoc,
  docMod, fileFromData, buildModule, modFromData, function)
import qualified Drasil.Shared.LanguageRenderer as R (commentedMod,
  commentedItem, parameterList, body, addComments, multiStmt, sqrt,
  abs, log10, log, exp, sin, cos, tan, asin, acos, atan, floor, ceil,
  elseIfLabel)
import qualified Drasil.GProc.RendererClassesProc as RC (module')
import qualified Drasil.Shared.LanguageRenderer.LanguagePolymorphic as G (
  comment, param, docFunc, var, multiBody, block, multiBlock, stmt, loopStmt,
  negateOp, plusOp, minusOp, multOp, divideOp, equalOp, greaterOp,
  greaterEqualOp, lessOp, lessEqualOp, csc, sec, cot, valueOf, litDouble,
  litInt, litString, valStmt, emptyStmt, assign, funcAppMixedArgs, call, print,
  ifCond)
import qualified Drasil.Shared.LanguageRenderer.CommonPseudoOO as CP (mainBody,
  functionDoc, docInOutFunc', inOutCall, multiAssign)
import qualified Drasil.Shared.LanguageRenderer.CLike as C (andOp, orOp,
  litTrue, litFalse)
import qualified Drasil.Shared.LanguageRenderer.Common as CS (varDecDef,
  extFuncAppMixedArgs)
import Drasil.Shared.AST (Terminator(..), FileType(Combined), FileData, fileD,
  FuncData, ModData, md, updateMod, MethodData, mthd, updateMthd, ParamData,
  paramVar, paramDoc, pd, ProgData, TypeData, cType, ValData, vd, val, valPrec,
  valInt, valType, opDoc, opPrec, VarData, varName,
  varType, varBind, varDoc, vard, progD, mthdDoc, modDoc)
import Drasil.Shared.CodeType (CodeType(..))
import Drasil.Shared.LanguageRenderer.Constructors (typeFromData, unOpPrec,
  powerPrec, unExpr, unExpr', binExpr, mkStateVal, mkVal,
  compEqualPrec, typeUnExpr, typeBinExpr)
import Drasil.Shared.LanguageRenderer (listSep')
import Drasil.Shared.LanguageRenderer.LanguagePolymorphic (OptionalSpace(..))
import Drasil.Shared.Helpers (toCode, toState, onCodeValue, onStateValue,
  onCodeList, onStateList, on2CodeValues, on2StateValues, emptyIfEmpty)
import Drasil.Shared.State (FS, lensGStoFS, lensMStoVS, revFiles,
  setFileType, getMainDoc)

import Control.Lens.Zoom (zoom)
import Control.Monad.State (modify)

import Drasil.FileHandling.Legacy (indent)
import Prelude hiding (break,print,sin,cos,tan,floor,(<>))
import Text.PrettyPrint.HughesPJ (Doc, empty, text, (<>), (<+>), vcat, hcat,
  parens, brackets, braces, equals, punctuate)

newtype MatlabCode a = MLC {forall a. MatlabCode a -> a
unMLC :: a} deriving (forall a b. (a -> b) -> MatlabCode a -> MatlabCode b)
-> (forall a b. a -> MatlabCode b -> MatlabCode a)
-> Functor MatlabCode
forall a b. a -> MatlabCode b -> MatlabCode a
forall a b. (a -> b) -> MatlabCode a -> MatlabCode b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> MatlabCode a -> MatlabCode b
fmap :: forall a b. (a -> b) -> MatlabCode a -> MatlabCode b
$c<$ :: forall a b. a -> MatlabCode b -> MatlabCode a
<$ :: forall a b. a -> MatlabCode b -> MatlabCode a
Functor

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

instance Monad MatlabCode where
  MLC a
x >>= :: forall a b. MatlabCode a -> (a -> MatlabCode b) -> MatlabCode b
>>= a -> MatlabCode b
f = a -> MatlabCode b
f a
x

instance SharedProg MatlabCode
instance ProcProg MatlabCode

instance ProgramSym MatlabCode where
  type Program MatlabCode = ProgData
  prog :: Label -> Label -> [SFile MatlabCode] -> GSProgram MatlabCode
prog Label
n Label
st [SFile MatlabCode]
files = do
    [MatlabCode FileData]
fs <- (StateT FileState Identity (MatlabCode FileData)
 -> StateT GOOLState Identity (MatlabCode FileData))
-> [StateT FileState Identity (MatlabCode FileData)]
-> StateT GOOLState Identity [MatlabCode FileData]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LensLike'
  (Zoomed (StateT FileState Identity) (MatlabCode FileData))
  GOOLState
  FileState
-> StateT FileState Identity (MatlabCode FileData)
-> StateT GOOLState Identity (MatlabCode 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) (MatlabCode FileData))
  GOOLState
  FileState
(FileState -> Focusing Identity (MatlabCode FileData) FileState)
-> GOOLState -> Focusing Identity (MatlabCode FileData) GOOLState
Lens' GOOLState FileState
lensGStoFS) [StateT FileState Identity (MatlabCode FileData)]
[SFile MatlabCode]
files
    (GOOLState -> GOOLState) -> StateT GOOLState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify GOOLState -> GOOLState
revFiles
    MatlabCode ProgData
-> StateT GOOLState Identity (MatlabCode ProgData)
forall a. a -> StateT GOOLState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MatlabCode ProgData
 -> StateT GOOLState Identity (MatlabCode ProgData))
-> MatlabCode ProgData
-> StateT GOOLState Identity (MatlabCode ProgData)
forall a b. (a -> b) -> a -> b
$ ([FileData] -> ProgData)
-> [MatlabCode FileData] -> MatlabCode ProgData
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList (Label -> Label -> [FileData] -> ProgData
progD Label
n Label
st) [MatlabCode FileData]
fs

instance CommonRenderSym MatlabCode
instance ProcRenderSym MatlabCode

instance UnRepr MatlabCode inner where
  unRepr :: MatlabCode inner -> inner
unRepr = MatlabCode inner -> inner
forall a. MatlabCode a -> a
unMLC

instance FileSym MatlabCode where
  type File MatlabCode = FileData
  fileDoc :: FSModule MatlabCode -> SFile MatlabCode
fileDoc FSModule MatlabCode
m = do
    (FileState -> FileState) -> StateT FileState Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (FileType -> FileState -> FileState
setFileType FileType
Combined)
    Label -> FSModule MatlabCode -> SFile MatlabCode
forall (r :: * -> *).
ProcRenderSym r =>
Label -> FSModule r -> SFile r
A.fileDoc Label
mlExt FSModule MatlabCode
m
  docMod :: Label
-> Label
-> [Label]
-> Label
-> SFile MatlabCode
-> SFile MatlabCode
docMod = Label
-> Label
-> Label
-> [Label]
-> Label
-> SFile MatlabCode
-> SFile MatlabCode
forall (r :: * -> *).
ProcRenderSym r =>
Label -> Label -> Label -> [Label] -> Label -> SFile r -> SFile r
A.docMod Label
mlExt

instance RenderFile MatlabCode where
  top :: MatlabCode (Module MatlabCode) -> MatlabCode (Block MatlabCode)
top MatlabCode (Module MatlabCode)
_ = Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty
  bottom :: MatlabCode (Block MatlabCode)
bottom = Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty
  commentedMod :: SFile MatlabCode -> FS (MatlabCode Doc) -> SFile MatlabCode
commentedMod = (MatlabCode FileData -> MatlabCode Doc -> MatlabCode FileData)
-> StateT FileState Identity (MatlabCode FileData)
-> FS (MatlabCode Doc)
-> StateT FileState Identity (MatlabCode FileData)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((FileData -> Doc -> FileData)
-> MatlabCode FileData -> MatlabCode Doc -> MatlabCode FileData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues FileData -> Doc -> FileData
R.commentedMod)
  fileFromData :: Label -> FSModule MatlabCode -> SFile MatlabCode
fileFromData = (Label
 -> MatlabCode (Module MatlabCode) -> MatlabCode (File MatlabCode))
-> Label -> FSModule MatlabCode -> SFile MatlabCode
forall (r :: * -> *).
ProcRenderSym r =>
(Label -> r (Module r) -> r (File r))
-> Label -> FSModule r -> SFile r
A.fileFromData ((ModData -> FileData) -> MatlabCode ModData -> MatlabCode FileData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((ModData -> FileData)
 -> MatlabCode ModData -> MatlabCode FileData)
-> (Label -> ModData -> FileData)
-> Label
-> MatlabCode ModData
-> MatlabCode FileData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> ModData -> FileData
fileD)

instance ImportSym MatlabCode where
  langImport :: Label -> MatlabCode Doc
langImport = Label -> MatlabCode Doc
forall a. HasCallStack => a
undefined
  modImport :: Label -> MatlabCode Doc
modImport = Label -> MatlabCode Doc
forall a. HasCallStack => a
undefined

instance BodySym MatlabCode where
  type Body MatlabCode = Doc
  body :: [MSBlock MatlabCode] -> MSBody MatlabCode
body = ([MatlabCode Doc] -> MatlabCode Doc)
-> [State MethodState (MatlabCode Doc)]
-> State MethodState (MatlabCode Doc)
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([Doc] -> Doc) -> [MatlabCode Doc] -> MatlabCode Doc
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [Doc] -> Doc
R.body)
  addComments :: Label -> MSBody MatlabCode -> MSBody MatlabCode
addComments Label
s = (MatlabCode Doc -> MatlabCode Doc)
-> State MethodState (MatlabCode Doc)
-> State MethodState (MatlabCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc) -> MatlabCode Doc -> MatlabCode Doc
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue (Label -> Doc -> Doc -> Doc
R.addComments Label
s Doc
mlCmtStart))

instance RenderBody MatlabCode where
  multiBody :: [MSBody MatlabCode] -> MSBody MatlabCode
multiBody = [MSBody MatlabCode] -> State MethodState (MatlabCode Doc)
[MSBody MatlabCode] -> MSBody MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, Monad r) =>
[MSBody r] -> MS (r Doc)
G.multiBody

instance BodyElim MatlabCode where
  body :: MatlabCode (Body MatlabCode) -> Doc
body = MatlabCode Doc -> Doc
MatlabCode (Body MatlabCode) -> Doc
forall a. MatlabCode a -> a
unMLC

instance BlockSym MatlabCode where
  type Block MatlabCode = Doc
  block :: [MSStatement MatlabCode] -> MSBlock MatlabCode
block = [MSStatement MatlabCode] -> State MethodState (MatlabCode Doc)
[MSStatement MatlabCode] -> MSBlock MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, Monad r) =>
[MSStatement r] -> MS (r Doc)
G.block

instance RenderBlock MatlabCode where
  multiBlock :: [MSBlock MatlabCode] -> MSBlock MatlabCode
multiBlock = [MSBlock MatlabCode] -> State MethodState (MatlabCode Doc)
[MSBlock MatlabCode] -> MSBlock MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, Monad r) =>
[MSBlock r] -> MS (r Doc)
G.multiBlock

instance BlockElim MatlabCode where
  block :: MatlabCode (Block MatlabCode) -> Doc
block = MatlabCode Doc -> Doc
MatlabCode (Block MatlabCode) -> Doc
forall a. MatlabCode a -> a
unMLC

instance TypeSym MatlabCode where
  bool :: VSType MatlabCode
bool = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Boolean Label
"logical"
  int :: VSType MatlabCode
int = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Integer Label
"int"
  float :: VSType MatlabCode
float = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Float Label
"double"
  double :: VSType MatlabCode
double = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Double Label
"double"
  char :: VSType MatlabCode
char = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Char Label
"char"
  string :: VSType MatlabCode
string = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
String Label
"string"
  infile :: VSType MatlabCode
infile = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
InFile Label
"file"
  outfile :: VSType MatlabCode
outfile = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
OutFile Label
"file"
  referenceType :: VSType MatlabCode -> VSType MatlabCode
referenceType = VSType MatlabCode -> VSType MatlabCode
forall a. a -> a
id -- Ignore reference types in "high-level" langauges for now; later on think about using boxed/unboxed types
  listType :: VSType MatlabCode -> VSType MatlabCode
listType = VSType MatlabCode -> VSType MatlabCode
forall a. HasCallStack => a
undefined
  setType :: VSType MatlabCode -> VSType MatlabCode
setType = VSType MatlabCode -> VSType MatlabCode
forall a. HasCallStack => a
undefined
  arrayType :: VSType MatlabCode -> VSType MatlabCode
arrayType = VSType MatlabCode -> VSType MatlabCode
forall a. HasCallStack => a
undefined
  innerType :: VSType MatlabCode -> VSType MatlabCode
innerType = VSType MatlabCode -> VSType MatlabCode
forall a. HasCallStack => a
undefined
  funcType :: [VSType MatlabCode] -> VSType MatlabCode -> VSType MatlabCode
funcType = [VSType MatlabCode] -> VSType MatlabCode -> VSType MatlabCode
forall a. HasCallStack => a
undefined
  void :: VSType MatlabCode
void = CodeType -> Label -> VSType MatlabCode
mlTy CodeType
Void Label
"void"

instance RenderType MatlabCode where
  multiType :: [VSType MatlabCode] -> VSType MatlabCode
multiType = [VSType MatlabCode] -> VSType MatlabCode
forall a. HasCallStack => a
undefined

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

instance BinaryOpSym MatlabCode where
  equalOp :: VSUnOp MatlabCode
equalOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.equalOp
  notEqualOp :: VSUnOp MatlabCode
notEqualOp = Label -> VSUnOp MatlabCode
forall (r :: * -> *). Monad r => Label -> VSOp r
compEqualPrec Label
"~="
  greaterOp :: VSUnOp MatlabCode
greaterOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterOp
  greaterEqualOp :: VSUnOp MatlabCode
greaterEqualOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.greaterEqualOp
  lessOp :: VSUnOp MatlabCode
lessOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.lessOp
  lessEqualOp :: VSUnOp MatlabCode
lessEqualOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.lessEqualOp
  plusOp :: VSUnOp MatlabCode
plusOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.plusOp
  minusOp :: VSUnOp MatlabCode
minusOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.minusOp
  multOp :: VSUnOp MatlabCode
multOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.multOp
  divideOp :: VSUnOp MatlabCode
divideOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
G.divideOp
  powerOp :: VSUnOp MatlabCode
powerOp = Label -> VSUnOp MatlabCode
forall (r :: * -> *). Monad r => Label -> VSOp r
powerPrec Label
"^"
  moduloOp :: VSUnOp MatlabCode
moduloOp = VSUnOp MatlabCode
forall a. HasCallStack => a
undefined
  andOp :: VSUnOp MatlabCode
andOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
C.andOp
  orOp :: VSUnOp MatlabCode
orOp = VSUnOp MatlabCode
forall (r :: * -> *). Monad r => VSOp r
C.orOp

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

instance ScopeSym MatlabCode where
  global :: MatlabCode ScopeData
global = MatlabCode ScopeData
forall a. HasCallStack => a
undefined
  mainFn :: MatlabCode ScopeData
mainFn = MatlabCode ScopeData
forall a. HasCallStack => a
undefined
  local :: MatlabCode ScopeData
local = MatlabCode ScopeData
forall a. HasCallStack => a
undefined

instance ScopeElim MatlabCode where
  scopeData :: MatlabCode ScopeData -> ScopeData
scopeData = MatlabCode ScopeData -> ScopeData
forall a. MatlabCode a -> a
unMLC

instance VariableSym MatlabCode where
  type Variable MatlabCode = VarData
  var :: Label -> VSType MatlabCode -> SVariable MatlabCode
var = Label -> VSType MatlabCode -> SVariable MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
Label -> VSType r -> SVariable r
G.var
  constant :: Label -> VSType MatlabCode -> SVariable MatlabCode
constant = Label -> VSType MatlabCode -> SVariable MatlabCode
forall (r :: * -> *).
VariableSym r =>
Label -> VSType r -> SVariable r
var
  extVar :: Label -> Label -> VSType MatlabCode -> SVariable MatlabCode
extVar = Label -> Label -> VSType MatlabCode -> VS (MatlabCode VarData)
Label -> Label -> VSType MatlabCode -> SVariable MatlabCode
forall a. HasCallStack => a
undefined

instance VariableElim MatlabCode where
  variableName :: MatlabCode (Variable MatlabCode) -> Label
variableName = VarData -> Label
varName (VarData -> Label)
-> (MatlabCode VarData -> VarData) -> MatlabCode VarData -> Label
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode VarData -> VarData
forall a. MatlabCode a -> a
unMLC
  variableType :: MatlabCode (Variable MatlabCode) -> MatlabCode TypeData
variableType = (VarData -> TypeData) -> MatlabCode VarData -> MatlabCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue VarData -> TypeData
varType

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

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

instance ValueSym MatlabCode where
  type Value MatlabCode = ValData
  valueType :: MatlabCode (Value MatlabCode) -> MatlabCode TypeData
valueType MatlabCode (Value MatlabCode)
v = ValData -> TypeData
valType (ValData -> TypeData) -> MatlabCode ValData -> MatlabCode TypeData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
<$> MatlabCode ValData
MatlabCode (Value MatlabCode)
v

instance Argument MatlabCode where
  pointerArg :: SValue MatlabCode -> SValue MatlabCode
pointerArg = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance Literal MatlabCode where
  litTrue :: SValue MatlabCode
litTrue = SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => SValue r
C.litTrue
  litFalse :: SValue MatlabCode
litFalse = SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => SValue r
C.litFalse
  litChar :: Char -> SValue MatlabCode
litChar = Char -> VS (MatlabCode ValData)
Char -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  litDouble :: Double -> SValue MatlabCode
litDouble = Double -> SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => Double -> SValue r
G.litDouble
  litFloat :: Float -> SValue MatlabCode
litFloat = Float -> VS (MatlabCode ValData)
Float -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  litInt :: Integer -> SValue MatlabCode
litInt = Integer -> SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => Integer -> SValue r
G.litInt
  litString :: Label -> SValue MatlabCode
litString = Label -> SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => Label -> SValue r
G.litString
  litArray :: VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
litArray = VSType MatlabCode
-> [VS (MatlabCode ValData)] -> VS (MatlabCode ValData)
VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  litList :: VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
litList = VSType MatlabCode
-> [VS (MatlabCode ValData)] -> VS (MatlabCode ValData)
VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  litSet :: VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
litSet = VSType MatlabCode
-> [VS (MatlabCode ValData)] -> VS (MatlabCode ValData)
VSType MatlabCode -> [SValue MatlabCode] -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance MathConstant MatlabCode where
  pi :: SValue MatlabCode
pi = VSType MatlabCode -> Doc -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSType r -> Doc -> SValue r
mkStateVal VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
double (Label -> Doc
text Label
"pi")

instance VariableValue MatlabCode where
  valueOf :: SVariable MatlabCode -> SValue MatlabCode
valueOf = SVariable MatlabCode -> SValue MatlabCode
forall (r :: * -> *). CommonRenderSym r => SVariable r -> SValue r
G.valueOf

instance CommandLineArgs MatlabCode where
  -- Args come in through the entry function's varargin (1-based, cell-indexed).
  arg :: Integer -> SValue MatlabCode
arg Integer
n = SValue MatlabCode -> SValue MatlabCode
mlArg (Integer -> SValue MatlabCode
forall (r :: * -> *). Literal r => Integer -> SValue r
litInt (Integer
n Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1))
  argsList :: SValue MatlabCode
argsList = VSType MatlabCode -> Doc -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSType r -> Doc -> SValue r
mkStateVal (VSType MatlabCode -> VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r -> VSType r
arrayType VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
string) (Label -> Doc
text Label
"varargin")
  argExists :: Integer -> SValue MatlabCode
argExists = Integer -> VS (MatlabCode ValData)
Integer -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance NumericExpression MatlabCode where
  #~ :: SValue MatlabCode -> SValue MatlabCode
(#~) = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr' VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
negateOp
  #/^ :: SValue MatlabCode -> SValue MatlabCode
(#/^) = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sqrtOp
  #| :: SValue MatlabCode -> SValue MatlabCode
(#|) = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
absOp
  #+ :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#+) = VSUnOp MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
plusOp
  #- :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#-) = VSUnOp MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
minusOp
  #* :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#*) = VSUnOp MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
multOp
  #/ :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#/) = VSUnOp MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
divideOp
  #% :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#%) = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  #^ :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(#^) = VSUnOp MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
VSBinOp r -> SValue r -> SValue r -> SValue r
binExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
powerOp
  log :: SValue MatlabCode -> SValue MatlabCode
log = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
logOp
  ln :: SValue MatlabCode -> SValue MatlabCode
ln = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
lnOp
  exp :: SValue MatlabCode -> SValue MatlabCode
exp = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
expOp
  sin :: SValue MatlabCode -> SValue MatlabCode
sin = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
sinOp
  cos :: SValue MatlabCode -> SValue MatlabCode
cos = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
cosOp
  tan :: SValue MatlabCode -> SValue MatlabCode
tan = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
tanOp
  csc :: SValue MatlabCode -> SValue MatlabCode
csc = SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
SValue r -> SValue r
G.csc
  sec :: SValue MatlabCode -> SValue MatlabCode
sec = SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
SValue r -> SValue r
G.sec
  cot :: SValue MatlabCode -> SValue MatlabCode
cot = SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
SValue r -> SValue r
G.cot
  arcsin :: SValue MatlabCode -> SValue MatlabCode
arcsin = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
asinOp
  arccos :: SValue MatlabCode -> SValue MatlabCode
arccos = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
acosOp
  arctan :: SValue MatlabCode -> SValue MatlabCode
arctan = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
atanOp
  floor :: SValue MatlabCode -> SValue MatlabCode
floor = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
floorOp
  ceil :: SValue MatlabCode -> SValue MatlabCode
ceil = VSUnOp MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> SValue r -> SValue r
unExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
ceilOp

instance BooleanExpression MatlabCode where
  ?! :: SValue MatlabCode -> SValue MatlabCode
(?!) = VSUnOp MatlabCode
-> VSType MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSUnOp r -> VSType r -> SValue r -> SValue r
typeUnExpr VSUnOp MatlabCode
forall (r :: * -> *). UnaryOpSym r => VSUnOp r
notOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?&& :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?&&) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
andOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?|| :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?||) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
orOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool

instance Comparison MatlabCode where
  ?< :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?<) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?<= :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?<=) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
lessEqualOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?> :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?>) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?>= :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?>=) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
greaterEqualOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?== :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?==) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
equalOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool
  ?!= :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
(?!=) = VSUnOp MatlabCode
-> VSType MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSBinOp r -> VSType r -> SValue r -> SValue r -> SValue r
typeBinExpr VSUnOp MatlabCode
forall (r :: * -> *). BinaryOpSym r => VSBinOp r
notEqualOp VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
bool

instance ValueExpression MatlabCode where
  inlineIf :: SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
inlineIf = VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  funcAppMixedArgs :: MixedCall MatlabCode
funcAppMixedArgs = MixedCall MatlabCode
forall (r :: * -> *). CommonRenderSym r => MixedCall r
G.funcAppMixedArgs
  extFuncAppMixedArgs :: Label -> MixedCall MatlabCode
extFuncAppMixedArgs = Label -> MixedCall MatlabCode
forall (r :: * -> *). CommonRenderSym r => Label -> MixedCall r
CS.extFuncAppMixedArgs
  libFuncAppMixedArgs :: Label -> MixedCall MatlabCode
libFuncAppMixedArgs = Label -> MixedCall MatlabCode
forall (r :: * -> *). CommonRenderSym r => Label -> MixedCall r
CS.extFuncAppMixedArgs
  lambda :: [VSBinder MatlabCode] -> SValue MatlabCode -> SValue MatlabCode
lambda = [VSBinder MatlabCode]
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
[VSBinder MatlabCode] -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  notNull :: SValue MatlabCode -> SValue MatlabCode
notNull = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance RenderValue MatlabCode where
  inputFunc :: SValue MatlabCode
inputFunc = VS (MatlabCode ValData)
SValue MatlabCode
forall a. HasCallStack => a
undefined
  printFunc :: SValue MatlabCode
printFunc = SValue MatlabCode
mlPrintFunc
  printLnFunc :: SValue MatlabCode
printLnFunc = SValue MatlabCode
mlPrintFunc
  printFileFunc :: SValue MatlabCode -> SValue MatlabCode
printFileFunc SValue MatlabCode
_ = SValue MatlabCode
mlPrintFunc
  printFileLnFunc :: SValue MatlabCode -> SValue MatlabCode
printFileLnFunc SValue MatlabCode
_ = SValue MatlabCode
mlPrintFunc
  cast :: VSType MatlabCode -> SValue MatlabCode -> SValue MatlabCode
cast = VSType MatlabCode
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
VSType MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  call :: Maybe Label -> Maybe Doc -> MixedCall MatlabCode
call = Doc -> Maybe Label -> Maybe Doc -> MixedCall MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
Doc -> Maybe Label -> Maybe Doc -> MixedCall r
G.call Doc
equals
  valFromData :: Maybe Int
-> Maybe Integer -> VSType MatlabCode -> Doc -> SValue MatlabCode
valFromData Maybe Int
p Maybe Integer
i VSType MatlabCode
t' Doc
d = do
    MatlabCode TypeData
t <- VSType MatlabCode
t'
    MatlabCode ValData -> VS (MatlabCode ValData)
forall a s. a -> State s a
toState (MatlabCode ValData -> VS (MatlabCode ValData))
-> MatlabCode ValData -> VS (MatlabCode ValData)
forall a b. (a -> b) -> a -> b
$ (TypeData -> Doc -> ValData)
-> MatlabCode TypeData -> MatlabCode Doc -> MatlabCode ValData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues (Maybe Int -> Maybe Integer -> TypeData -> Doc -> ValData
vd Maybe Int
p Maybe Integer
i) MatlabCode TypeData
t (Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
d)

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

instance IndexTranslator MatlabCode where
  intToIndex :: SValue MatlabCode -> SValue MatlabCode
intToIndex = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  indexToInt :: SValue MatlabCode -> SValue MatlabCode
indexToInt = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance Reference MatlabCode where
  makeRef :: SValue MatlabCode -> SValue MatlabCode
makeRef = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. a -> a
id
  maybeDeref :: SValue MatlabCode -> SValue MatlabCode
maybeDeref = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. a -> a
id

instance Array MatlabCode where
  arrayElem :: SValue MatlabCode -> SValue MatlabCode -> SVariable MatlabCode
arrayElem = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode VarData)
SValue MatlabCode -> SValue MatlabCode -> SVariable MatlabCode
forall a. HasCallStack => a
undefined
  arrayLength :: SValue MatlabCode -> SValue MatlabCode
arrayLength = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  arrayCopy :: SValue MatlabCode -> SValue MatlabCode
arrayCopy = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance List MatlabCode where
  listSize :: SValue MatlabCode -> SValue MatlabCode
listSize = VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  listAdd :: SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
listAdd = VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  listAppend :: SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
listAppend = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  listAccess :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
listAccess = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  listSet :: SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
listSet = VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode
-> SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  indexOf :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
indexOf = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance Set MatlabCode where
  contains :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
contains = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  setAdd :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
setAdd = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  setRemove :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
setRemove = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined
  setUnion :: SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
setUnion = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> VS (MatlabCode ValData)
SValue MatlabCode -> SValue MatlabCode -> SValue MatlabCode
forall a. HasCallStack => a
undefined

instance InternalList MatlabCode where
  listSlice' :: Maybe (SValue MatlabCode)
-> Maybe (SValue MatlabCode)
-> Maybe (SValue MatlabCode)
-> SVariable MatlabCode
-> SValue MatlabCode
-> MSBlock MatlabCode
listSlice' = Maybe (VS (MatlabCode ValData))
-> Maybe (VS (MatlabCode ValData))
-> Maybe (VS (MatlabCode ValData))
-> VS (MatlabCode VarData)
-> VS (MatlabCode ValData)
-> State MethodState (MatlabCode Doc)
Maybe (SValue MatlabCode)
-> Maybe (SValue MatlabCode)
-> Maybe (SValue MatlabCode)
-> SVariable MatlabCode
-> SValue MatlabCode
-> MSBlock MatlabCode
forall a. HasCallStack => a
undefined

instance InternalListFunc MatlabCode where
  listAccessFunc :: VSType MatlabCode -> SValue MatlabCode -> VSFunction MatlabCode
listAccessFunc = VSType MatlabCode
-> VS (MatlabCode ValData) -> VS (MatlabCode FuncData)
VSType MatlabCode -> SValue MatlabCode -> VSFunction MatlabCode
forall a. HasCallStack => a
undefined

instance BinderSym MatlabCode where
  binder :: Label -> VSType MatlabCode -> VSBinder MatlabCode
binder = Label -> VSType MatlabCode -> VSBinder MatlabCode
forall a. HasCallStack => a
undefined

instance BinderElim MatlabCode where
  binderName :: MatlabCode BinderD -> Label
binderName = MatlabCode BinderD -> Label
forall a. HasCallStack => a
undefined
  binderType :: MatlabCode BinderD -> MatlabCode TypeData
binderType = MatlabCode BinderD -> MatlabCode TypeData
forall a. HasCallStack => a
undefined

instance InternalBinderElim MatlabCode where
  binderElim :: MatlabCode BinderD -> Doc
binderElim = MatlabCode BinderD -> Doc
forall a. HasCallStack => a
undefined

instance RenderFunction MatlabCode where
  funcFromData :: Doc -> VSType MatlabCode -> VSFunction MatlabCode
funcFromData = Doc -> VSType MatlabCode -> VS (MatlabCode FuncData)
Doc -> VSType MatlabCode -> VSFunction MatlabCode
forall a. HasCallStack => a
undefined

instance FunctionElim MatlabCode where
  functionType :: MatlabCode (Function MatlabCode) -> MatlabCode TypeData
functionType = MatlabCode FuncData -> MatlabCode TypeData
MatlabCode (Function MatlabCode) -> MatlabCode TypeData
forall a. HasCallStack => a
undefined
  function :: MatlabCode (Function MatlabCode) -> Doc
function = MatlabCode FuncData -> Doc
MatlabCode (Function MatlabCode) -> Doc
forall a. HasCallStack => a
undefined

instance InternalAssignStmt MatlabCode where
  multiAssign :: [SVariable MatlabCode]
-> [SValue MatlabCode] -> MSStatement MatlabCode
multiAssign = (Doc -> Doc)
-> [SVariable MatlabCode]
-> [SValue MatlabCode]
-> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
(Doc -> Doc) -> [SVariable r] -> [SValue r] -> MSStatement r
CP.multiAssign Doc -> Doc
brackets

instance InternalIOStmt MatlabCode where
  printSt :: Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
printSt = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
mlPrint

instance InternalControlStmt MatlabCode where
  multiReturn :: [SValue MatlabCode] -> MSStatement MatlabCode
multiReturn = [VS (MatlabCode ValData)] -> MS (MatlabCode (Doc, Terminator))
[SValue MatlabCode] -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance RenderStatement MatlabCode where
  stmt :: MSStatement MatlabCode -> MSStatement MatlabCode
stmt = MSStatement MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
MSStatement r -> MSStatement r
G.stmt
  loopStmt :: MSStatement MatlabCode -> MSStatement MatlabCode
loopStmt = MSStatement MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
MSStatement r -> MSStatement r
G.loopStmt
  stmtFromData :: Doc -> Terminator -> MSStatement MatlabCode
stmtFromData Doc
d Terminator
t = MatlabCode (Statement MatlabCode) -> MSStatement MatlabCode
forall a s. a -> State s a
toState (MatlabCode (Statement MatlabCode) -> MSStatement MatlabCode)
-> MatlabCode (Statement MatlabCode) -> MSStatement MatlabCode
forall a b. (a -> b) -> a -> b
$ (Doc, Terminator) -> MatlabCode (Doc, Terminator)
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc
d, Terminator
t)

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

instance StatementSym MatlabCode where
  type Statement MatlabCode = (Doc, Terminator)
  valStmt :: SValue MatlabCode -> MSStatement MatlabCode
valStmt = Terminator -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
Terminator -> SValue r -> MSStatement r
G.valStmt Terminator
Semi
  emptyStmt :: MSStatement MatlabCode
emptyStmt = MSStatement MatlabCode
forall (r :: * -> *). CommonRenderSym r => MSStatement r
G.emptyStmt
  multi :: [MSStatement MatlabCode] -> MSStatement MatlabCode
multi = ([MatlabCode (Doc, Terminator)] -> MatlabCode (Doc, Terminator))
-> [MS (MatlabCode (Doc, Terminator))]
-> MS (MatlabCode (Doc, Terminator))
forall a b s. ([a] -> b) -> [State s a] -> State s b
onStateList (([(Doc, Terminator)] -> (Doc, Terminator))
-> [MatlabCode (Doc, Terminator)] -> MatlabCode (Doc, Terminator)
forall (m :: * -> *) a b. Monad m => ([a] -> b) -> [m a] -> m b
onCodeList [(Doc, Terminator)] -> (Doc, Terminator)
R.multiStmt)

instance AssignStatement MatlabCode where
  assign :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
assign = Terminator
-> SVariable MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
Terminator -> SVariable r -> SValue r -> MSStatement r
G.assign Terminator
Semi
  &-= :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
(&-=) = VS (MatlabCode VarData)
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  &+= :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
(&+=) = VS (MatlabCode VarData)
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  &++ :: SVariable MatlabCode -> MSStatement MatlabCode
(&++) = VS (MatlabCode VarData) -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  &-- :: SVariable MatlabCode -> MSStatement MatlabCode
(&--) = VS (MatlabCode VarData) -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance DeclStatement MatlabCode where
  varDec :: SVariable MatlabCode
-> MatlabCode ScopeData -> MSStatement MatlabCode
varDec SVariable MatlabCode
v MatlabCode ScopeData
scp = SVariable MatlabCode
-> MatlabCode ScopeData
-> Maybe (SValue MatlabCode)
-> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
SVariable r -> r ScopeData -> Maybe (SValue r) -> MSStatement r
CS.varDecDef SVariable MatlabCode
v MatlabCode ScopeData
scp Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
forall a. Maybe a
Nothing
  varDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> SValue MatlabCode
-> MSStatement MatlabCode
varDecDef SVariable MatlabCode
v MatlabCode ScopeData
scp SValue MatlabCode
e = SVariable MatlabCode
-> MatlabCode ScopeData
-> Maybe (SValue MatlabCode)
-> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
SVariable r -> r ScopeData -> Maybe (SValue r) -> MSStatement r
CS.varDecDef SVariable MatlabCode
v MatlabCode ScopeData
scp (VS (MatlabCode ValData) -> Maybe (VS (MatlabCode ValData))
forall a. a -> Maybe a
Just VS (MatlabCode ValData)
SValue MatlabCode
e)
  setDec :: SVariable MatlabCode
-> MatlabCode ScopeData -> MSStatement MatlabCode
setDec = VS (MatlabCode VarData)
-> MatlabCode ScopeData -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  setDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> SValue MatlabCode
-> MSStatement MatlabCode
setDecDef = VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData
-> SValue MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  listDec :: Integer
-> SVariable MatlabCode
-> MatlabCode ScopeData
-> MSStatement MatlabCode
listDec = Integer
-> VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> MS (MatlabCode (Doc, Terminator))
Integer
-> SVariable MatlabCode
-> MatlabCode ScopeData
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  listDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> [SValue MatlabCode]
-> MSStatement MatlabCode
listDecDef = VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> [VS (MatlabCode ValData)]
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData
-> [SValue MatlabCode]
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  arrayDec :: Integer
-> SVariable MatlabCode
-> MatlabCode ScopeData
-> MSStatement MatlabCode
arrayDec = Integer
-> VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> MS (MatlabCode (Doc, Terminator))
Integer
-> SVariable MatlabCode
-> MatlabCode ScopeData
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  arrayDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> [SValue MatlabCode]
-> MSStatement MatlabCode
arrayDecDef = VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> [VS (MatlabCode ValData)]
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData
-> [SValue MatlabCode]
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  constDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> SValue MatlabCode
-> MSStatement MatlabCode
constDecDef = VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData
-> SValue MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  funcDecDef :: SVariable MatlabCode
-> MatlabCode ScopeData
-> [SVariable MatlabCode]
-> MSBody MatlabCode
-> MSStatement MatlabCode
funcDecDef = VS (MatlabCode VarData)
-> MatlabCode ScopeData
-> [VS (MatlabCode VarData)]
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> MatlabCode ScopeData
-> [SVariable MatlabCode]
-> MSBody MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance IOStatement MatlabCode where
  print :: SValue MatlabCode -> MSStatement MatlabCode
print = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
False Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
forall a. Maybe a
Nothing SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc
  printLn :: SValue MatlabCode -> MSStatement MatlabCode
printLn = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
True Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
forall a. Maybe a
Nothing SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc
  printStr :: Label -> MSStatement MatlabCode
printStr = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
False Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
forall a. Maybe a
Nothing SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc (SValue MatlabCode -> MS (MatlabCode (Doc, Terminator)))
-> (Label -> SValue MatlabCode)
-> Label
-> MS (MatlabCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString
  printStrLn :: Label -> MSStatement MatlabCode
printStrLn = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
True Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
forall a. Maybe a
Nothing SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc (SValue MatlabCode -> MS (MatlabCode (Doc, Terminator)))
-> (Label -> SValue MatlabCode)
-> Label
-> MS (MatlabCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString
  printFile :: SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
printFile SValue MatlabCode
f = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
False (VS (MatlabCode ValData) -> Maybe (VS (MatlabCode ValData))
forall a. a -> Maybe a
Just VS (MatlabCode ValData)
SValue MatlabCode
f) SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printFunc
  printFileLn :: SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
printFileLn SValue MatlabCode
f = Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
(CommonRenderSym r, UnRepr r TypeData) =>
Bool -> Maybe (SValue r) -> SValue r -> SValue r -> MSStatement r
G.print Bool
True (VS (MatlabCode ValData) -> Maybe (VS (MatlabCode ValData))
forall a. a -> Maybe a
Just VS (MatlabCode ValData)
SValue MatlabCode
f) SValue MatlabCode
forall (r :: * -> *). RenderValue r => SValue r
printLnFunc
  printFileStr :: SValue MatlabCode -> Label -> MSStatement MatlabCode
printFileStr SValue MatlabCode
f = SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
IOStatement r =>
SValue r -> SValue r -> MSStatement r
printFile SValue MatlabCode
f (VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator)))
-> (Label -> VS (MatlabCode ValData))
-> Label
-> MS (MatlabCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> VS (MatlabCode ValData)
Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString
  printFileStrLn :: SValue MatlabCode -> Label -> MSStatement MatlabCode
printFileStrLn SValue MatlabCode
f = SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
IOStatement r =>
SValue r -> SValue r -> MSStatement r
printFileLn SValue MatlabCode
f (VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator)))
-> (Label -> VS (MatlabCode ValData))
-> Label
-> MS (MatlabCode (Doc, Terminator))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> VS (MatlabCode ValData)
Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString
  getInput :: SVariable MatlabCode -> MSStatement MatlabCode
getInput = VS (MatlabCode VarData) -> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  discardInput :: MSStatement MatlabCode
discardInput = MS (MatlabCode (Doc, Terminator))
MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  getFileInput :: SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
getFileInput SValue MatlabCode
f = SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
mlInput (SValue MatlabCode -> SValue MatlabCode
mlReadLine SValue MatlabCode
f)
  discardFileInput :: SValue MatlabCode -> MSStatement MatlabCode
discardFileInput SValue MatlabCode
f = SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *). StatementSym r => SValue r -> MSStatement r
valStmt (SValue MatlabCode -> SValue MatlabCode
mlReadLine SValue MatlabCode
f)
  openFileR :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
openFileR SVariable MatlabCode
f SValue MatlabCode
n = SVariable MatlabCode
f SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
AssignStatement r =>
SVariable r -> SValue r -> MSStatement r
&= PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"fopen" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
infile [SValue MatlabCode
n, Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString Label
"r"]
  openFileW :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
openFileW SVariable MatlabCode
f SValue MatlabCode
n = SVariable MatlabCode
f SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
AssignStatement r =>
SVariable r -> SValue r -> MSStatement r
&= PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"fopen" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
outfile [SValue MatlabCode
n, Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString Label
"w"]
  openFileA :: SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
openFileA SVariable MatlabCode
f SValue MatlabCode
n = SVariable MatlabCode
f SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
AssignStatement r =>
SVariable r -> SValue r -> MSStatement r
&= PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"fopen" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
outfile [SValue MatlabCode
n, Label -> SValue MatlabCode
forall (r :: * -> *). Literal r => Label -> SValue r
litString Label
"a"]
  closeFile :: SValue MatlabCode -> MSStatement MatlabCode
closeFile SValue MatlabCode
f = SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *). StatementSym r => SValue r -> MSStatement r
valStmt (SValue MatlabCode -> MSStatement MatlabCode)
-> SValue MatlabCode -> MSStatement MatlabCode
forall a b. (a -> b) -> a -> b
$ PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"fclose" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
void [SValue MatlabCode
f]
  getFileInputLine :: SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
getFileInputLine = SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
IOStatement r =>
SValue r -> SVariable r -> MSStatement r
getFileInput
  discardFileLine :: SValue MatlabCode -> MSStatement MatlabCode
discardFileLine = SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *). IOStatement r => SValue r -> MSStatement r
discardFileInput
  getFileInputAll :: SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
getFileInputAll = VS (MatlabCode ValData)
-> VS (MatlabCode VarData) -> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance StringStatement MatlabCode where
  stringSplit :: Char
-> SVariable MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
stringSplit = Char
-> VS (MatlabCode VarData)
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
Char
-> SVariable MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  stringListVals :: [SVariable MatlabCode]
-> SValue MatlabCode -> MSStatement MatlabCode
stringListVals = [VS (MatlabCode VarData)]
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
[SVariable MatlabCode]
-> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  stringListLists :: [SVariable MatlabCode]
-> SValue MatlabCode -> MSStatement MatlabCode
stringListLists = [VS (MatlabCode VarData)]
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
[SVariable MatlabCode]
-> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance FunctionSym MatlabCode where
  type Function MatlabCode = FuncData

instance FuncAppStatement MatlabCode where
  inOutCall :: InOutCall MatlabCode
inOutCall = PosCall MatlabCode -> InOutCall MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
(Label -> VSType r -> [SValue r] -> SValue r)
-> Label
-> [SValue r]
-> [SVariable r]
-> [SVariable r]
-> MSStatement r
CP.inOutCall PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp
  extInOutCall :: Label -> InOutCall MatlabCode
extInOutCall = Label
-> Label
-> [VS (MatlabCode ValData)]
-> [VS (MatlabCode VarData)]
-> [VS (MatlabCode VarData)]
-> MS (MatlabCode (Doc, Terminator))
Label -> InOutCall MatlabCode
forall a. HasCallStack => a
undefined

instance CommentStatement MatlabCode where
  comment :: Label -> MSStatement MatlabCode
comment = Doc -> Label -> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
Doc -> Label -> MSStatement r
G.comment Doc
mlCmtStart

instance ControlStatement MatlabCode where
  break :: MSStatement MatlabCode
break = MS (MatlabCode (Doc, Terminator))
MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  continue :: MSStatement MatlabCode
continue = MS (MatlabCode (Doc, Terminator))
MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  -- MATLAB has no `return <expr>`: a function returns by assigning its named
  -- output, so a return becomes `result = <value>;`.
  returnStmt :: SValue MatlabCode -> MSStatement MatlabCode
returnStmt SValue MatlabCode
v' = do
    MatlabCode ValData
v <- LensLike'
  (Zoomed (StateT ValueState Identity) (MatlabCode ValData))
  MethodState
  ValueState
-> VS (MatlabCode ValData)
-> StateT MethodState Identity (MatlabCode ValData)
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) (MatlabCode ValData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (MatlabCode ValData) ValueState)
-> MethodState
-> Focusing Identity (MatlabCode ValData) MethodState
Lens' MethodState ValueState
lensMStoVS VS (MatlabCode ValData)
SValue MatlabCode
v'
    Label -> VSType MatlabCode -> SVariable MatlabCode
forall (r :: * -> *).
VariableSym r =>
Label -> VSType r -> SVariable r
var Label
mlRet (MatlabCode TypeData -> VSType MatlabCode
forall a s. a -> State s a
toState (MatlabCode (Value MatlabCode) -> MatlabCode TypeData
forall (r :: * -> *). ValueSym r => r (Value r) -> r TypeData
valueType MatlabCode ValData
MatlabCode (Value MatlabCode)
v)) SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
AssignStatement r =>
SVariable r -> SValue r -> MSStatement r
&= SValue MatlabCode
v'
  throw :: Label -> MSStatement MatlabCode
throw = Label -> MS (MatlabCode (Doc, Terminator))
Label -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  ifCond :: [(SValue MatlabCode, MSBody MatlabCode)]
-> MSBody MatlabCode -> MSStatement MatlabCode
ifCond = (Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue MatlabCode, MSBody MatlabCode)]
-> MSBody MatlabCode
-> MSStatement MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
(Doc -> Doc)
-> Doc
-> OptionalSpace
-> Doc
-> Doc
-> Doc
-> [(SValue r, MSBody r)]
-> MSBody r
-> MSStatement r
G.ifCond Doc -> Doc
forall a. a -> a
id Doc
empty (Doc -> OptionalSpace
OSpace Doc
empty) Doc
R.elseIfLabel Doc
empty (Label -> Doc
text Label
"end")
  switch :: SValue MatlabCode
-> [(SValue MatlabCode, MSBody MatlabCode)]
-> MSBody MatlabCode
-> MSStatement MatlabCode
switch = VS (MatlabCode ValData)
-> [(VS (MatlabCode ValData), State MethodState (MatlabCode Doc))]
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode
-> [(SValue MatlabCode, MSBody MatlabCode)]
-> MSBody MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  ifExists :: SValue MatlabCode
-> MSBody MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
ifExists = VS (MatlabCode ValData)
-> State MethodState (MatlabCode Doc)
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode
-> MSBody MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  for :: MSStatement MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
-> MSBody MatlabCode
-> MSStatement MatlabCode
for = MS (MatlabCode (Doc, Terminator))
-> VS (MatlabCode ValData)
-> MS (MatlabCode (Doc, Terminator))
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
MSStatement MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
-> MSBody MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  forRange :: SVariable MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> MSBody MatlabCode
-> MSStatement MatlabCode
forRange = VS (MatlabCode VarData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> VS (MatlabCode ValData)
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> SValue MatlabCode
-> MSBody MatlabCode
-> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  forEach :: SVariable MatlabCode
-> SValue MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
forEach = VS (MatlabCode VarData)
-> VS (MatlabCode ValData)
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SVariable MatlabCode
-> SValue MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  while :: SValue MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
while = VS (MatlabCode ValData)
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  tryCatch :: MSBody MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
tryCatch = State MethodState (MatlabCode Doc)
-> State MethodState (MatlabCode Doc)
-> MS (MatlabCode (Doc, Terminator))
MSBody MatlabCode -> MSBody MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined
  assert :: SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
assert = VS (MatlabCode ValData)
-> VS (MatlabCode ValData) -> MS (MatlabCode (Doc, Terminator))
SValue MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall a. HasCallStack => a
undefined

instance VisibilitySym MatlabCode where
  type Visibility MatlabCode = Doc
  private :: MatlabCode (Visibility MatlabCode)
private = Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty
  public :: MatlabCode (Visibility MatlabCode)
public = Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode Doc
empty

instance RenderVisibility MatlabCode where
  visibilityFromData :: VisibilityTag -> Doc -> MatlabCode (Visibility MatlabCode)
visibilityFromData = VisibilityTag -> Doc -> MatlabCode Doc
VisibilityTag -> Doc -> MatlabCode (Visibility MatlabCode)
forall a. HasCallStack => a
undefined

instance VisibilityElim MatlabCode where
  visibility :: MatlabCode (Visibility MatlabCode) -> Doc
visibility = MatlabCode Doc -> Doc
MatlabCode (Visibility MatlabCode) -> Doc
forall a. MatlabCode a -> a
unMLC

instance MethodTypeSym MatlabCode where
  type MethodType MatlabCode = TypeData
  mType :: VSType MatlabCode -> MSMthdType MatlabCode
mType = LensLike'
  (Zoomed (StateT ValueState Identity) (MatlabCode TypeData))
  MethodState
  ValueState
-> VSType MatlabCode
-> StateT MethodState Identity (MatlabCode 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) (MatlabCode TypeData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (MatlabCode TypeData) ValueState)
-> MethodState
-> Focusing Identity (MatlabCode TypeData) MethodState
Lens' MethodState ValueState
lensMStoVS

instance ParameterSym MatlabCode where
  type Parameter MatlabCode = ParamData
  -- A MATLAB parameter is just the variable name.
  param :: SVariable MatlabCode -> MSParameter MatlabCode
param = (MatlabCode (Variable MatlabCode) -> Doc)
-> SVariable MatlabCode -> MSParameter MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
(r (Variable r) -> Doc) -> SVariable r -> MSParameter r
G.param MatlabCode (Variable MatlabCode) -> Doc
mlParam
  pointerParam :: SVariable MatlabCode -> MSParameter MatlabCode
pointerParam = SVariable MatlabCode -> MSParameter MatlabCode
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MSParameter r
param

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

instance ParamElim MatlabCode where
  parameterName :: MatlabCode (Parameter MatlabCode) -> Label
parameterName = MatlabCode VarData -> Label
MatlabCode (Variable MatlabCode) -> Label
forall (r :: * -> *). VariableElim r => r (Variable r) -> Label
variableName (MatlabCode VarData -> Label)
-> (MatlabCode ParamData -> MatlabCode VarData)
-> MatlabCode ParamData
-> Label
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> VarData)
-> MatlabCode ParamData -> MatlabCode VarData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> VarData
paramVar
  parameterType :: MatlabCode (Parameter MatlabCode) -> MatlabCode TypeData
parameterType = MatlabCode VarData -> MatlabCode TypeData
MatlabCode (Variable MatlabCode) -> MatlabCode TypeData
forall (r :: * -> *).
VariableElim r =>
r (Variable r) -> r TypeData
variableType (MatlabCode VarData -> MatlabCode TypeData)
-> (MatlabCode ParamData -> MatlabCode VarData)
-> MatlabCode ParamData
-> MatlabCode TypeData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParamData -> VarData)
-> MatlabCode ParamData -> MatlabCode VarData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ParamData -> VarData
paramVar
  parameter :: MatlabCode (Parameter MatlabCode) -> Doc
parameter = ParamData -> Doc
paramDoc (ParamData -> Doc)
-> (MatlabCode ParamData -> ParamData)
-> MatlabCode ParamData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode ParamData -> ParamData
forall a. MatlabCode a -> a
unMLC

instance MethodSym MatlabCode where
  type Method MatlabCode = MethodData
  docMain :: MSBody MatlabCode -> SMethod MatlabCode
docMain = MSBody MatlabCode -> SMethod MatlabCode
forall (r :: * -> *). MethodSym r => MSBody r -> SMethod r
mainFunction
  function :: Label
-> MatlabCode (Visibility MatlabCode)
-> VSType MatlabCode
-> [MSParameter MatlabCode]
-> MSBody MatlabCode
-> SMethod MatlabCode
function = Label
-> MatlabCode (Visibility MatlabCode)
-> VSType MatlabCode
-> [MSParameter MatlabCode]
-> MSBody MatlabCode
-> SMethod MatlabCode
forall (r :: * -> *).
ProcRenderSym r =>
Label
-> r (Visibility r)
-> VSType r
-> [MSParameter r]
-> MSBody r
-> SMethod r
A.function
  mainFunction :: MSBody MatlabCode -> SMethod MatlabCode
mainFunction = MSBody MatlabCode -> SMethod MatlabCode
forall (r :: * -> *). CommonRenderSym r => MSBody r -> SMethod r
CP.mainBody
  docFunc :: Label
-> [Label]
-> Maybe Label
-> SMethod MatlabCode
-> SMethod MatlabCode
docFunc = FuncDocRenderer
-> Label
-> [Label]
-> Maybe Label
-> SMethod MatlabCode
-> SMethod MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
FuncDocRenderer
-> Label -> [Label] -> Maybe Label -> SMethod r -> SMethod r
G.docFunc FuncDocRenderer
CP.functionDoc

  -- MATLAB returns values through the output list in the header
  -- (function [outs] = name(ins)), not through a return statement, so we build
  -- the method directly instead of reusing the shared inOutFunc machinery.
  inOutFunc :: Label -> MatlabCode (Visibility MatlabCode) -> InOutFunc MatlabCode
inOutFunc Label
n MatlabCode (Visibility MatlabCode)
_ [SVariable MatlabCode]
ins [SVariable MatlabCode]
outs [SVariable MatlabCode]
both MSBody MatlabCode
b = do
    [MatlabCode (Parameter MatlabCode)]
pms  <- (SVariable MatlabCode -> MSParameter MatlabCode)
-> [SVariable MatlabCode]
-> StateT MethodState Identity [MatlabCode (Parameter MatlabCode)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM SVariable MatlabCode -> MSParameter MatlabCode
forall (r :: * -> *).
ParameterSym r =>
SVariable r -> MSParameter r
param ([SVariable MatlabCode]
both [SVariable MatlabCode]
-> [SVariable MatlabCode] -> [SVariable MatlabCode]
forall a. [a] -> [a] -> [a]
++ [SVariable MatlabCode]
ins)
    [MatlabCode VarData]
rets <- (VS (MatlabCode VarData)
 -> StateT MethodState Identity (MatlabCode VarData))
-> [VS (MatlabCode VarData)]
-> StateT MethodState Identity [MatlabCode VarData]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (LensLike'
  (Zoomed (StateT ValueState Identity) (MatlabCode VarData))
  MethodState
  ValueState
-> VS (MatlabCode VarData)
-> StateT MethodState Identity (MatlabCode VarData)
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) (MatlabCode VarData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (MatlabCode VarData) ValueState)
-> MethodState
-> Focusing Identity (MatlabCode VarData) MethodState
Lens' MethodState ValueState
lensMStoVS) ([VS (MatlabCode VarData)]
[SVariable MatlabCode]
both [VS (MatlabCode VarData)]
-> [VS (MatlabCode VarData)] -> [VS (MatlabCode VarData)]
forall a. [a] -> [a] -> [a]
++ [VS (MatlabCode VarData)]
[SVariable MatlabCode]
outs)
    MatlabCode Doc
bod  <- State MethodState (MatlabCode Doc)
MSBody MatlabCode
b
    MatlabCode MethodData
-> StateT MethodState Identity (MatlabCode MethodData)
forall a. a -> StateT MethodState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MatlabCode MethodData
 -> StateT MethodState Identity (MatlabCode MethodData))
-> MatlabCode MethodData
-> StateT MethodState Identity (MatlabCode MethodData)
forall a b. (a -> b) -> a -> b
$ MethodData -> MatlabCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> MatlabCode MethodData)
-> MethodData -> MatlabCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd (Doc -> MethodData) -> Doc -> MethodData
forall a b. (a -> b) -> a -> b
$ Label -> [Doc] -> [MatlabCode (Parameter MatlabCode)] -> Doc -> Doc
forall (r :: * -> *).
CommonRenderSym r =>
Label -> [Doc] -> [r (Parameter r)] -> Doc -> Doc
mlFuncDoc Label
n ((MatlabCode VarData -> Doc) -> [MatlabCode VarData] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map MatlabCode VarData -> Doc
MatlabCode (Variable MatlabCode) -> Doc
forall (r :: * -> *). InternalVarElim r => r (Variable r) -> Doc
RC.variable [MatlabCode VarData]
rets) [MatlabCode (Parameter MatlabCode)]
pms (MatlabCode (Body MatlabCode) -> Doc
forall (r :: * -> *). BodyElim r => r (Body r) -> Doc
RC.body MatlabCode Doc
MatlabCode (Body MatlabCode)
bod)
  docInOutFunc :: Label
-> MatlabCode (Visibility MatlabCode) -> DocInOutFunc MatlabCode
docInOutFunc Label
n MatlabCode (Visibility MatlabCode)
s = FuncDocRenderer -> InOutFunc MatlabCode -> DocInOutFunc MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
FuncDocRenderer
-> ([SVariable r]
    -> [SVariable r] -> [SVariable r] -> MSBody r -> SMethod r)
-> Label
-> [(Label, SVariable r)]
-> [(Label, SVariable r)]
-> [(Label, SVariable r)]
-> MSBody r
-> SMethod r
CP.docInOutFunc' FuncDocRenderer
CP.functionDoc (Label -> MatlabCode (Visibility MatlabCode) -> InOutFunc MatlabCode
forall (r :: * -> *).
MethodSym r =>
Label -> r (Visibility r) -> InOutFunc r
inOutFunc Label
n MatlabCode (Visibility MatlabCode)
s)

instance RenderMethod MatlabCode where
  commentedFunc :: State MethodState (MatlabCode Doc)
-> SMethod MatlabCode -> SMethod MatlabCode
commentedFunc State MethodState (MatlabCode Doc)
cmt SMethod MatlabCode
m = (MatlabCode MethodData
 -> MatlabCode (Doc -> Doc) -> MatlabCode MethodData)
-> StateT MethodState Identity (MatlabCode MethodData)
-> State MethodState (MatlabCode (Doc -> Doc))
-> StateT MethodState Identity (MatlabCode MethodData)
forall a b c s.
(a -> b -> c) -> State s a -> State s b -> State s c
on2StateValues ((MethodData -> (Doc -> Doc) -> MethodData)
-> MatlabCode MethodData
-> MatlabCode (Doc -> Doc)
-> MatlabCode MethodData
forall (r :: * -> *) a b c.
Applicative r =>
(a -> b -> c) -> r a -> r b -> r c
on2CodeValues MethodData -> (Doc -> Doc) -> MethodData
updateMthd) StateT MethodState Identity (MatlabCode MethodData)
SMethod MatlabCode
m
    ((MatlabCode Doc -> MatlabCode (Doc -> Doc))
-> State MethodState (MatlabCode Doc)
-> State MethodState (MatlabCode (Doc -> Doc))
forall a b s. (a -> b) -> State s a -> State s b
onStateValue ((Doc -> Doc -> Doc) -> MatlabCode Doc -> MatlabCode (Doc -> Doc)
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue Doc -> Doc -> Doc
R.commentedItem) State MethodState (MatlabCode Doc)
cmt)
  mthdFromData :: VisibilityTag -> Doc -> SMethod MatlabCode
mthdFromData VisibilityTag
_ Doc
d = MatlabCode (Method MatlabCode) -> SMethod MatlabCode
forall a s. a -> State s a
toState (MatlabCode (Method MatlabCode) -> SMethod MatlabCode)
-> MatlabCode (Method MatlabCode) -> SMethod MatlabCode
forall a b. (a -> b) -> a -> b
$ MethodData -> MatlabCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> MatlabCode MethodData)
-> MethodData -> MatlabCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd Doc
d

instance ProcRenderMethod MatlabCode where
  intFunc :: Bool
-> Label
-> MatlabCode (Visibility MatlabCode)
-> MSMthdType MatlabCode
-> [MSParameter MatlabCode]
-> MSBody MatlabCode
-> SMethod MatlabCode
intFunc Bool
_ Label
n MatlabCode (Visibility MatlabCode)
_ MSMthdType MatlabCode
t [MSParameter MatlabCode]
ps MSBody MatlabCode
b = do
    [MatlabCode ParamData]
pms <- [State MethodState (MatlabCode ParamData)]
-> StateT MethodState Identity [MatlabCode ParamData]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [State MethodState (MatlabCode ParamData)]
[MSParameter MatlabCode]
ps
    MatlabCode TypeData
tp  <- StateT MethodState Identity (MatlabCode TypeData)
MSMthdType MatlabCode
t
    MatlabCode Doc
bod <- State MethodState (MatlabCode Doc)
MSBody MatlabCode
b
    -- A function with a non-void return type declares the output variable
    -- 'result' in its header (function result = name(...)); returnStmt then
    -- assigns to it. Void functions declare no output.
    let outs :: [Doc]
outs = [Label -> Doc
text Label
mlRet | TypeData -> CodeType
cType (MatlabCode TypeData -> TypeData
forall a. MatlabCode a -> a
unMLC MatlabCode TypeData
tp) CodeType -> CodeType -> Bool
forall a. Eq a => a -> a -> Bool
/= CodeType
Void]
    MatlabCode MethodData
-> StateT MethodState Identity (MatlabCode MethodData)
forall a. a -> StateT MethodState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MatlabCode MethodData
 -> StateT MethodState Identity (MatlabCode MethodData))
-> MatlabCode MethodData
-> StateT MethodState Identity (MatlabCode MethodData)
forall a b. (a -> b) -> a -> b
$ MethodData -> MatlabCode MethodData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (MethodData -> MatlabCode MethodData)
-> MethodData -> MatlabCode MethodData
forall a b. (a -> b) -> a -> b
$ Doc -> MethodData
mthd (Doc -> MethodData) -> Doc -> MethodData
forall a b. (a -> b) -> a -> b
$ Label -> [Doc] -> [MatlabCode (Parameter MatlabCode)] -> Doc -> Doc
forall (r :: * -> *).
CommonRenderSym r =>
Label -> [Doc] -> [r (Parameter r)] -> Doc -> Doc
mlFuncDoc Label
n [Doc]
outs [MatlabCode ParamData]
[MatlabCode (Parameter MatlabCode)]
pms (MatlabCode (Body MatlabCode) -> Doc
forall (r :: * -> *). BodyElim r => r (Body r) -> Doc
RC.body MatlabCode Doc
MatlabCode (Body MatlabCode)
bod)

instance MethodElim MatlabCode where
  method :: MatlabCode (Method MatlabCode) -> Doc
method = MethodData -> Doc
mthdDoc (MethodData -> Doc)
-> (MatlabCode MethodData -> MethodData)
-> MatlabCode MethodData
-> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode MethodData -> MethodData
forall a. MatlabCode a -> a
unMLC

instance ModuleSym MatlabCode where
  type Module MatlabCode = ModData
  -- Function-file layout (runs in both MATLAB and Octave): the main code
  -- becomes the entry function `function <name>(varargin) ... end` and comes
  -- first, then the local functions. Command-line args map to varargin.
  buildModule :: Label -> [Label] -> [SMethod MatlabCode] -> FSModule MatlabCode
buildModule Label
n [Label]
_ = Label
-> FS Doc -> FS Doc -> [SMethod MatlabCode] -> FSModule MatlabCode
forall (r :: * -> *).
ProcRenderSym r =>
Label -> FS Doc -> FS Doc -> [SMethod r] -> FSModule r
A.buildModule Label
n (Label -> FS Doc
mlMainFunc Label
n) (Doc -> FS Doc
forall a. a -> StateT FileState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Doc
empty)

instance RenderMod MatlabCode where
  modFromData :: Label -> FS Doc -> FSModule MatlabCode
modFromData Label
n = Label
-> (Doc -> MatlabCode (Module MatlabCode))
-> FS Doc
-> FSModule MatlabCode
forall (r :: * -> *).
Label -> (Doc -> r (Module r)) -> FS Doc -> FSModule r
A.modFromData Label
n (ModData -> MatlabCode ModData
forall (r :: * -> *) a. Monad r => a -> r a
toCode (ModData -> MatlabCode ModData)
-> (Doc -> ModData) -> Doc -> MatlabCode ModData
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> Doc -> ModData
md Label
n)
  updateModuleDoc :: (Doc -> Doc)
-> MatlabCode (Module MatlabCode) -> MatlabCode (Module MatlabCode)
updateModuleDoc Doc -> Doc
f = (ModData -> ModData) -> MatlabCode ModData -> MatlabCode ModData
forall (r :: * -> *) a b. Functor r => (a -> b) -> r a -> r b
onCodeValue ((Doc -> Doc) -> ModData -> ModData
updateMod Doc -> Doc
f)

instance ModuleElim MatlabCode where
  module' :: MatlabCode (Module MatlabCode) -> Doc
module' = ModData -> Doc
modDoc (ModData -> Doc)
-> (MatlabCode ModData -> ModData) -> MatlabCode ModData -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode ModData -> ModData
forall a. MatlabCode a -> a
unMLC

instance BlockCommentSym MatlabCode where
  blockComment :: [Label] -> MatlabCode Doc
blockComment [Label]
lns = Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> MatlabCode Doc) -> Doc -> MatlabCode Doc
forall a b. (a -> b) -> a -> b
$ [Label] -> Doc
mlLineCmt [Label]
lns
  docComment :: forall a. State a [Label] -> State a (MatlabCode Doc)
docComment = ([Label] -> MatlabCode Doc)
-> State a [Label] -> State a (MatlabCode Doc)
forall a b s. (a -> b) -> State s a -> State s b
onStateValue (Doc -> MatlabCode Doc
forall (r :: * -> *) a. Monad r => a -> r a
toCode (Doc -> MatlabCode Doc)
-> ([Label] -> Doc) -> [Label] -> MatlabCode Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Label] -> Doc
mlLineCmt)

instance BlockCommentElim MatlabCode where
  blockComment' :: MatlabCode Doc -> Doc
blockComment' = MatlabCode Doc -> Doc
forall a. MatlabCode a -> a
unMLC

-- convenience
mlName, mlVersion :: String
mlName :: Label
mlName = Label
"MATLAB"
mlVersion :: Label
mlVersion = Label
"R2024b"

-- | MATLAB source file extension.
mlExt :: String
mlExt :: Label
mlExt = Label
"m"

-- | Name of the implicit output variable a value-returning function assigns to.
mlRet :: String
mlRet :: Label
mlRet = Label
"result"

-- | Makes a MATLAB type. Only the 'CodeType' tag is used (internally); the
--   name is never written out, since MATLAB code has no type annotations.
mlTy :: CodeType -> String -> VSType MatlabCode
mlTy :: CodeType -> Label -> VSType MatlabCode
mlTy CodeType
c Label
s = CodeType -> Label -> Doc -> VSType MatlabCode
forall (r :: * -> *).
Monad r =>
CodeType -> Label -> Doc -> VSType r
typeFromData CodeType
c Label
s (Label -> Doc
text Label
s)

-- | A MATLAB parameter renders as just the variable name.
mlParam :: MatlabCode (Variable MatlabCode) -> Doc
mlParam :: MatlabCode (Variable MatlabCode) -> Doc
mlParam = MatlabCode (Variable MatlabCode) -> Doc
forall (r :: * -> *). InternalVarElim r => r (Variable r) -> Doc
RC.variable

-- | Renders a MATLAB function: @function [outs] = name(ins) ... end@.
--   With no outputs the @[outs] =@ part is dropped; with a single output the
--   brackets are dropped (@function out = name(ins)@).
mlFuncDoc :: (CommonRenderSym r) => Label -> [Doc] -> [r (Parameter r)] -> Doc
  -> Doc
mlFuncDoc :: forall (r :: * -> *).
CommonRenderSym r =>
Label -> [Doc] -> [r (Parameter r)] -> Doc -> Doc
mlFuncDoc Label
n [Doc]
outs [r (Parameter r)]
pms Doc
bod =
  [Doc] -> Doc
vcat [Label -> Doc
text Label
"function" Doc -> Doc -> Doc
<+> (Doc
retDoc Doc -> Doc -> Doc
<> Label -> Doc
text Label
n) Doc -> Doc -> Doc
<> Doc -> Doc
parens ([r (Parameter r)] -> Doc
forall (r :: * -> *). CommonRenderSym r => [r (Parameter r)] -> Doc
R.parameterList [r (Parameter r)]
pms),
        Doc -> Doc
indent Doc
bod,
        Label -> Doc
text Label
"end"]
  where retDoc :: Doc
retDoc = case [Doc]
outs of
          []  -> Doc
empty
          [Doc
o] -> Doc
o Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<> Label -> Doc
text Label
" "
          [Doc]
os  -> Doc -> Doc
brackets ([Doc] -> Doc
hcat (Doc -> [Doc] -> [Doc]
punctuate (Label -> Doc
text Label
", ") [Doc]
os)) Doc -> Doc -> Doc
<+> Doc
equals Doc -> Doc -> Doc
<> Label -> Doc
text Label
" "

-- Comments
mlCmtStart :: Doc
mlCmtStart :: Doc
mlCmtStart = Label -> Doc
text Label
"%"

-- | Makes a MATLAB comment. Every line starts with %.
--   (We avoid %{ %} blocks: those need the markers alone on a line.)
mlLineCmt :: [String] -> Doc
mlLineCmt :: [Label] -> Doc
mlLineCmt = [Doc] -> Doc
vcat ([Doc] -> Doc) -> ([Label] -> [Doc]) -> [Label] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Label -> Doc) -> [Label] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map ((Doc
mlCmtStart Doc -> Doc -> Doc
<+>) (Doc -> Doc) -> (Label -> Doc) -> Label -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Label -> Doc
text)

-- | A stand-in print function. mlPrint never uses it, but it must be a real
--   value so the print methods type-check.
mlPrintFunc :: SValue MatlabCode
mlPrintFunc :: SValue MatlabCode
mlPrintFunc = VSType MatlabCode -> Doc -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
VSType r -> Doc -> SValue r
mkStateVal VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
void (Label -> Doc
text Label
"fprintf")

-- | Gets a command-line argument: argv(){n}.
--   (Octave keeps the args in a cell, so we index with {}.)
-- | Wraps the main body as the entry function: @function <name>(varargin) ...
--   end@. Empty if there is no main body.
mlMainFunc :: Label -> FS Doc
mlMainFunc :: Label -> FS Doc
mlMainFunc Label
n = do
  Doc
b <- FS Doc
getMainDoc
  Doc -> FS Doc
forall a. a -> StateT FileState Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Doc -> FS Doc) -> Doc -> FS Doc
forall a b. (a -> b) -> a -> b
$ Doc -> Doc -> Doc
emptyIfEmpty Doc
b (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
vcat
    [Label -> Doc
text Label
"function" Doc -> Doc -> Doc
<+> Label -> Doc
text Label
n Doc -> Doc -> Doc
<> Doc -> Doc
parens (Label -> Doc
text Label
"varargin"),
     Doc -> Doc
indent Doc
b,
     Label -> Doc
text Label
"end"]

mlArg :: SValue MatlabCode -> SValue MatlabCode
mlArg :: SValue MatlabCode -> SValue MatlabCode
mlArg SValue MatlabCode
n' = do
  MatlabCode ValData
n <- VS (MatlabCode ValData)
SValue MatlabCode
n'
  MatlabCode TypeData
s <- VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
string
  MatlabCode TypeData -> Doc -> SValue MatlabCode
forall (r :: * -> *).
CommonRenderSym r =>
r TypeData -> Doc -> SValue r
mkVal MatlabCode TypeData
s (Label -> Doc
text Label
"varargin" Doc -> Doc -> Doc
<> Doc -> Doc
braces (MatlabCode (Value MatlabCode) -> Doc
forall (r :: * -> *). ValueElim r => r (Value r) -> Doc
RC.value MatlabCode ValData
MatlabCode (Value MatlabCode)
n))

-- | Reads one line from a file as text: fgetl(f).
mlReadLine :: SValue MatlabCode -> SValue MatlabCode
mlReadLine :: SValue MatlabCode -> SValue MatlabCode
mlReadLine SValue MatlabCode
f = PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"fgetl" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
string [SValue MatlabCode
f]

-- | Reads a value into v. Numbers go through str2double; text is kept as-is.
--   The type of v says which one to use.
mlInput :: SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
mlInput :: SValue MatlabCode -> SVariable MatlabCode -> MSStatement MatlabCode
mlInput SValue MatlabCode
inSrc SVariable MatlabCode
v = SVariable MatlabCode
v SVariable MatlabCode -> SValue MatlabCode -> MSStatement MatlabCode
forall (r :: * -> *).
AssignStatement r =>
SVariable r -> SValue r -> MSStatement r
&= (VS (MatlabCode VarData)
SVariable MatlabCode
v VS (MatlabCode VarData)
-> (MatlabCode VarData -> VS (MatlabCode ValData))
-> VS (MatlabCode ValData)
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 (MatlabCode ValData)
CodeType -> SValue MatlabCode
mlInput' (CodeType -> VS (MatlabCode ValData))
-> (MatlabCode VarData -> CodeType)
-> MatlabCode VarData
-> VS (MatlabCode ValData)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode TypeData -> CodeType
forall (r :: * -> *). UnRepr r TypeData => r TypeData -> CodeType
getCodeType (MatlabCode TypeData -> CodeType)
-> (MatlabCode VarData -> MatlabCode TypeData)
-> MatlabCode VarData
-> CodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatlabCode VarData -> MatlabCode TypeData
MatlabCode (Variable MatlabCode) -> MatlabCode TypeData
forall (r :: * -> *).
VariableElim r =>
r (Variable r) -> r TypeData
variableType)
  where mlInput' :: CodeType -> SValue MatlabCode
mlInput' CodeType
Integer = PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"str2double" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
int [SValue MatlabCode
inSrc]
        mlInput' CodeType
Float   = PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"str2double" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
float [SValue MatlabCode
inSrc]
        mlInput' CodeType
Double  = PosCall MatlabCode
forall (r :: * -> *). ValueExpression r => PosCall r
funcApp Label
"str2double" VSType MatlabCode
forall (r :: * -> *). TypeSym r => VSType r
double [SValue MatlabCode
inSrc]
        mlInput' CodeType
String  = SValue MatlabCode
inSrc
        mlInput' CodeType
_ = Label -> VS (MatlabCode ValData)
forall a. HasCallStack => Label -> a
error Label
"Attempt to read a value of unreadable type"

-- | Prints a value: fprintf([fid, ]'fmt', value). The format is %s for text
--   and %g for numbers. A line-print adds \n. A file handle, if given, comes
--   first. (We always use fprintf, so the print-function argument is ignored.)
mlPrint :: Bool -> Maybe (SValue MatlabCode) -> SValue MatlabCode
  -> SValue MatlabCode -> MSStatement MatlabCode
mlPrint :: Bool
-> Maybe (SValue MatlabCode)
-> SValue MatlabCode
-> SValue MatlabCode
-> MSStatement MatlabCode
mlPrint Bool
newLn Maybe (SValue MatlabCode)
f' SValue MatlabCode
_ SValue MatlabCode
v' = do
  MatlabCode ValData
v  <- LensLike'
  (Zoomed (StateT ValueState Identity) (MatlabCode ValData))
  MethodState
  ValueState
-> VS (MatlabCode ValData)
-> StateT MethodState Identity (MatlabCode ValData)
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) (MatlabCode ValData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (MatlabCode ValData) ValueState)
-> MethodState
-> Focusing Identity (MatlabCode ValData) MethodState
Lens' MethodState ValueState
lensMStoVS VS (MatlabCode ValData)
SValue MatlabCode
v'
  Maybe (MatlabCode ValData)
mf <- (VS (MatlabCode ValData)
 -> StateT MethodState Identity (MatlabCode ValData))
-> Maybe (VS (MatlabCode ValData))
-> StateT MethodState Identity (Maybe (MatlabCode ValData))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (LensLike'
  (Zoomed (StateT ValueState Identity) (MatlabCode ValData))
  MethodState
  ValueState
-> VS (MatlabCode ValData)
-> StateT MethodState Identity (MatlabCode ValData)
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) (MatlabCode ValData))
  MethodState
  ValueState
(ValueState -> Focusing Identity (MatlabCode ValData) ValueState)
-> MethodState
-> Focusing Identity (MatlabCode ValData) MethodState
Lens' MethodState ValueState
lensMStoVS) Maybe (VS (MatlabCode ValData))
Maybe (SValue MatlabCode)
f'
  let fmt :: Label
fmt = case TypeData -> CodeType
cType (ValData -> TypeData
valType (MatlabCode ValData -> ValData
forall a. MatlabCode a -> a
unMLC MatlabCode ValData
v)) of
              CodeType
String -> Label
"%s"
              CodeType
_      -> Label
"%g"
      nl :: Label
nl = if Bool
newLn then Label
"\\n" else Label
""
      fileArg :: Doc
fileArg = Doc
-> (MatlabCode ValData -> Doc) -> Maybe (MatlabCode ValData) -> Doc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Doc
empty (\MatlabCode ValData
fv -> MatlabCode (Value MatlabCode) -> Doc
forall (r :: * -> *). ValueElim r => r (Value r) -> Doc
RC.value MatlabCode ValData
MatlabCode (Value MatlabCode)
fv Doc -> Doc -> Doc
<> Doc
listSep') Maybe (MatlabCode ValData)
mf
  Doc -> Terminator -> MSStatement MatlabCode
forall (r :: * -> *).
RenderStatement r =>
Doc -> Terminator -> MSStatement r
stmtFromData (Label -> Doc
text Label
"fprintf" Doc -> Doc -> Doc
<>
    Doc -> Doc
parens (Doc
fileArg Doc -> Doc -> Doc
<> Label -> Doc
text (Label
"'" Label -> Label -> Label
forall a. [a] -> [a] -> [a]
++ Label
fmt Label -> Label -> Label
forall a. [a] -> [a] -> [a]
++ Label
nl Label -> Label -> Label
forall a. [a] -> [a] -> [a]
++ Label
"'") Doc -> Doc -> Doc
<> Doc
listSep' Doc -> Doc -> Doc
<> MatlabCode (Value MatlabCode) -> Doc
forall (r :: * -> *). ValueElim r => r (Value r) -> Doc
RC.value MatlabCode ValData
MatlabCode (Value MatlabCode)
v))
    Terminator
Semi