This library provides selector functions, test and update operations as well as some useful auxiliary functions for TypedFlatCurry data terms. Most of the provided functions are based on general transformation functions that replace constructors with user-defined functions. For recursive datatypes the transformations are defined inductively over the term structure. This is quite usual for transformations on TypedFlatCurry terms, so the provided functions can be used to implement specific transformations without having to explicitly state the recursion. Essentially, the tedious part of such transformations - descend in fairly complex term structures - is abstracted away, which hopefully makes the code more clear and brief.
Author: Kai-Oliver Prott
Version: October 2015
trTProg
:: (String -> [String] -> [TypeDecl] -> [TFuncDecl] -> [OpDecl] -> a) -> TProg -> a transform program |
tProgName
:: TProg -> String get name from program |
tProgImports
:: TProg -> [String] get imports from program |
tProgTypes
:: TProg -> [TypeDecl] get type declarations from program |
tProgTFuncs
:: TProg -> [TFuncDecl] get functions from program |
tProgOps
:: TProg -> [OpDecl] get infix operators from program |
updTProg
:: (String -> String) -> ([String] -> [String]) -> ([TypeDecl] -> [TypeDecl]) -> ([TFuncDecl] -> [TFuncDecl]) -> ([OpDecl] -> [OpDecl]) -> TProg -> TProg update program |
updTProgName
:: (String -> String) -> TProg -> TProg update name of program |
updTProgImports
:: ([String] -> [String]) -> TProg -> TProg update imports of program |
updTProgTypes
:: ([TypeDecl] -> [TypeDecl]) -> TProg -> TProg update type declarations of program |
updTProgTFuncs
:: ([TFuncDecl] -> [TFuncDecl]) -> TProg -> TProg update functions of program |
updTProgOps
:: ([OpDecl] -> [OpDecl]) -> TProg -> TProg update infix operators of program |
allVarsInTProg
:: TProg -> [(Int,TypeExpr)] get all program variables (also from patterns) |
updTProgTExps
:: (TExpr -> TExpr) -> TProg -> TProg lift transformation on expressions to program |
rnmAllVarsInTProg
:: (Int -> Int) -> TProg -> TProg rename programs variables |
updQNamesInTProg
:: ((String,String) -> (String,String)) -> TProg -> TProg update all qualified names in program |
rnmTProg
:: String -> TProg -> TProg rename program (update name of and all qualified names in program) |
trTFunc
:: ((String,String) -> Int -> Visibility -> TypeExpr -> TRule -> a) -> TFuncDecl -> a transform function |
tFuncName
:: TFuncDecl -> (String,String) get name of function |
tFuncArity
:: TFuncDecl -> Int get arity of function |
tFuncVisibility
:: TFuncDecl -> Visibility get visibility of function |
tFuncType
:: TFuncDecl -> TypeExpr get type of function |
tFuncTRule
:: TFuncDecl -> TRule get rule of function |
updTFunc
:: ((String,String) -> (String,String)) -> (Int -> Int) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> (TRule -> TRule) -> TFuncDecl -> TFuncDecl update function |
updTFuncName
:: ((String,String) -> (String,String)) -> TFuncDecl -> TFuncDecl update name of function |
updTFuncArity
:: (Int -> Int) -> TFuncDecl -> TFuncDecl update arity of function |
updTFuncVisibility
:: (Visibility -> Visibility) -> TFuncDecl -> TFuncDecl update visibility of function |
updFuncType
:: (TypeExpr -> TypeExpr) -> TFuncDecl -> TFuncDecl update type of function |
updTFuncTRule
:: (TRule -> TRule) -> TFuncDecl -> TFuncDecl update rule of function |
isPublicTFunc
:: TFuncDecl -> Bool is function public? |
isExternal
:: TFuncDecl -> Bool is function externally defined? |
allVarsInTFunc
:: TFuncDecl -> [(Int,TypeExpr)] get variable names in a function declaration |
tFuncArgs
:: TFuncDecl -> [(Int,TypeExpr)] get arguments of function, if not externally defined |
tFuncBody
:: TFuncDecl -> TExpr get body of function, if not externally defined |
tFuncRHS
:: TFuncDecl -> [TExpr] get the right-hand-sides of a FuncDecl |
rnmAllVarsInTFunc
:: (Int -> Int) -> TFuncDecl -> TFuncDecl rename all variables in function |
updQNamesInTFunc
:: ((String,String) -> (String,String)) -> TFuncDecl -> TFuncDecl update all qualified names in function |
updTFuncArgs
:: ([(Int,TypeExpr)] -> [(Int,TypeExpr)]) -> TFuncDecl -> TFuncDecl update arguments of function, if not externally defined |
updTFuncBody
:: (TExpr -> TExpr) -> TFuncDecl -> TFuncDecl update body of function, if not externally defined |
trTRule
:: ([(Int,TypeExpr)] -> TExpr -> a) -> (TypeExpr -> String -> a) -> TRule -> a transform rule |
tRuleArgs
:: TRule -> [(Int,TypeExpr)] get rules arguments if it's not external |
tRuleBody
:: TRule -> TExpr get rules body if it's not external |
tRuleExtDecl
:: TRule -> String get rules external declaration |
isTRuleExternal
:: TRule -> Bool is rule external? |
updTRule
:: (TypeExpr -> TypeExpr) -> ([(Int,TypeExpr)] -> [(Int,TypeExpr)]) -> (TExpr -> TExpr) -> (String -> String) -> TRule -> TRule update rule |
updTRuleType
:: (TypeExpr -> TypeExpr) -> TRule -> TRule update rules TypeExpr |
updTRuleArgs
:: ([(Int,TypeExpr)] -> [(Int,TypeExpr)]) -> TRule -> TRule update rules arguments |
updTRuleBody
:: (TExpr -> TExpr) -> TRule -> TRule update rules body |
updTRuleExtDecl
:: (String -> String) -> TRule -> TRule update rules external declaration |
allVarsInTRule
:: TRule -> [(Int,TypeExpr)] get variable names in a functions rule |
rnmAllVarsInTRule
:: (Int -> Int) -> TRule -> TRule rename all variables in rule |
updQNamesInTRule
:: ((String,String) -> (String,String)) -> TRule -> TRule update all qualified names in rule |
varNr
:: TExpr -> Int get internal number of variable |
literal
:: TExpr -> Literal get literal if expression is literal expression |
combType
:: TExpr -> CombType get combination type of a combined expression |
combName
:: TExpr -> (String,String) get name of a combined expression |
combArgs
:: TExpr -> [TExpr] get arguments of a combined expression |
missingCombArgs
:: TExpr -> Int get number of missing arguments if expression is combined |
letBinds
:: TExpr -> [((Int,TypeExpr),TExpr)] get indices of variables in let declaration |
letBody
:: TExpr -> TExpr get body of let declaration |
freeVars
:: TExpr -> [(Int,TypeExpr)] get variable indices from declaration of free variables |
freeExpr
:: TExpr -> TExpr get expression from declaration of free variables |
orExps
:: TExpr -> [TExpr] get expressions from or-expression |
caseType
:: TExpr -> CaseType get case-type of case expression |
caseExpr
:: TExpr -> TExpr get scrutinee of case expression |
caseBranches
:: TExpr -> [TBranchExpr] get branch expressions from case expression |
isTVarE
:: TExpr -> Bool is expression a variable? |
isTLit
:: TExpr -> Bool is expression a literal expression? |
isTComb
:: TExpr -> Bool is expression combined? |
isTLet
:: TExpr -> Bool is expression a let expression? |
isTFree
:: TExpr -> Bool is expression a declaration of free variables? |
isTOr
:: TExpr -> Bool is expression an or-expression? |
isTCase
:: TExpr -> Bool is expression a case expression? |
trTExpr
:: (TypeExpr -> Int -> a) -> (TypeExpr -> Literal -> a) -> (TypeExpr -> CombType -> (String,String) -> [a] -> a) -> ([((Int,TypeExpr),a)] -> a -> a) -> ([(Int,TypeExpr)] -> a -> a) -> (a -> a -> a) -> (CaseType -> a -> [b] -> a) -> (TPattern -> a -> b) -> (a -> TypeExpr -> a) -> TExpr -> a transform expression |
updVars
:: (TypeExpr -> Int -> TExpr) -> TExpr -> TExpr update all variables in given expression |
updLiterals
:: (TypeExpr -> Literal -> TExpr) -> TExpr -> TExpr update all literals in given expression |
updCombs
:: (TypeExpr -> CombType -> (String,String) -> [TExpr] -> TExpr) -> TExpr -> TExpr update all combined expressions in given expression |
updLets
:: ([((Int,TypeExpr),TExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr update all let expressions in given expression |
updFrees
:: ([(Int,TypeExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr update all free declarations in given expression |
updOrs
:: (TExpr -> TExpr -> TExpr) -> TExpr -> TExpr update all or expressions in given expression |
updCases
:: (CaseType -> TExpr -> [TBranchExpr] -> TExpr) -> TExpr -> TExpr update all case expressions in given expression |
updBranches
:: (TPattern -> TExpr -> TBranchExpr) -> TExpr -> TExpr update all case branches in given expression |
updTypeds
:: (TExpr -> TypeExpr -> TExpr) -> TExpr -> TExpr update all typed expressions in given expression |
isFuncCall
:: TExpr -> Bool is expression a call of a function where all arguments are provided? |
isFuncPartCall
:: TExpr -> Bool is expression a partial function call? |
isConsCall
:: TExpr -> Bool is expression a call of a constructor? |
isConsPartCall
:: TExpr -> Bool is expression a partial constructor call? |
isGround
:: TExpr -> Bool is expression fully evaluated? |
allVars
:: TExpr -> [(Int,TypeExpr)] get all variables (also pattern variables) in expression |
rnmAllVars
:: (Int -> Int) -> TExpr -> TExpr rename all variables (also in patterns) in expression |
updQNames
:: ((String,String) -> (String,String)) -> TExpr -> TExpr update all qualified names in expression |
trTBranch
:: (TPattern -> TExpr -> a) -> TBranchExpr -> a transform branch expression |
tBranchTPattern
:: TBranchExpr -> TPattern get pattern from branch expression |
tBranchTExpr
:: TBranchExpr -> TExpr get expression from branch expression |
updTBranch
:: (TPattern -> TPattern) -> (TExpr -> TExpr) -> TBranchExpr -> TBranchExpr update branch expression |
updTBranchTPattern
:: (TPattern -> TPattern) -> TBranchExpr -> TBranchExpr update pattern of branch expression |
updTBranchTExpr
:: (TExpr -> TExpr) -> TBranchExpr -> TBranchExpr update expression of branch expression |
trTPattern
:: (TypeExpr -> (String,String) -> [(Int,TypeExpr)] -> a) -> (TypeExpr -> Literal -> a) -> TPattern -> a transform pattern |
tPatCons
:: TPattern -> (String,String) get name from constructor pattern |
tPatArgs
:: TPattern -> [(Int,TypeExpr)] get arguments from constructor pattern |
tPatLiteral
:: TPattern -> Literal get literal from literal pattern |
isConsPattern
:: TPattern -> Bool is pattern a constructor pattern? |
updTPattern
:: (TypeExpr -> TypeExpr) -> ((String,String) -> (String,String)) -> ([(Int,TypeExpr)] -> [(Int,TypeExpr)]) -> (Literal -> Literal) -> TPattern -> TPattern update pattern |
updTPatType
:: (TypeExpr -> TypeExpr) -> TPattern -> TPattern update TypeExpr of pattern |
updTPatCons
:: ((String,String) -> (String,String)) -> TPattern -> TPattern update constructors name of pattern |
updTPatArgs
:: ([(Int,TypeExpr)] -> [(Int,TypeExpr)]) -> TPattern -> TPattern update arguments of constructor pattern |
updTPatLiteral
:: (Literal -> Literal) -> TPattern -> TPattern update literal of pattern |
tPatExpr
:: TPattern -> TExpr build expression from pattern |
transform program |
get imports from program |
get type declarations from program |
get functions from program |
update program |
update name of program |
update imports of program |
update type declarations of program |
update functions of program |
update infix operators of program |
get all program variables (also from patterns) |
lift transformation on expressions to program |
rename programs variables |
update all qualified names in program |
rename program (update name of and all qualified names in program) |
transform function |
get arity of function |
get visibility of function |
get rule of function |
update function |
update name of function |
update arity of function |
update visibility of function |
update type of function |
update rule of function |
is function public? |
is function externally defined? |
get variable names in a function declaration |
get the right-hand-sides of a FuncDecl
|
rename all variables in function |
update all qualified names in function |
update arguments of function, if not externally defined |
update body of function, if not externally defined |
transform rule |
get rules external declaration |
is rule external? |
update rule |
update rules TypeExpr |
update rules arguments |
update rules body |
update rules external declaration |
get variable names in a functions rule |
rename all variables in rule |
update all qualified names in rule |
get number of missing arguments if expression is combined |
get branch expressions from case expression |
transform expression |
update all literals in given expression |
update all combined expressions in given expression |
update all let expressions in given expression |
update all free declarations in given expression |
update all case expressions in given expression |
update all case branches in given expression |
update all typed expressions in given expression |
is expression a call of a function where all arguments are provided? |
is expression a partial function call? |
is expression a call of a constructor? |
is expression a partial constructor call? |
rename all variables (also in patterns) in expression |
update all qualified names in expression |
transform branch expression |
get pattern from branch expression |
get expression from branch expression |
update branch expression |
update pattern of branch expression |
update expression of branch expression |
transform pattern |
get literal from literal pattern |
is pattern a constructor pattern? |
update pattern |
update TypeExpr of pattern |
update constructors name of pattern |
update arguments of constructor pattern |
update literal of pattern |