This library provides selector functions, test and update operations as well as some useful auxiliary functions for FlatCurry 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 FlatCurry 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.
type Update a b
= (b -> b) -> a -> a
trProg
:: (String -> [String] -> [TypeDecl] -> [AFuncDecl a] -> [OpDecl] -> b) -> AProg a -> b
transform program
get name from program
progImports
:: AProg a -> [String]
get imports from program
progTypes
:: AProg a -> [TypeDecl]
get type declarations from program
progFuncs
:: AProg a -> [AFuncDecl a]
get functions from program
progOps
:: AProg a -> [OpDecl]
get infix operators from program
updProg
:: (String -> String) -> ([String] -> [String]) -> ([TypeDecl] -> [TypeDecl]) -> ([AFuncDecl a] -> [AFuncDecl a]) -> ([OpDecl] -> [OpDecl]) -> AProg a -> AProg a
update program
updProgName
:: (String -> String) -> AProg a -> AProg a
update name of program
updProgImports
:: ([String] -> [String]) -> AProg a -> AProg a
update imports of program
updProgTypes
:: ([TypeDecl] -> [TypeDecl]) -> AProg a -> AProg a
update type declarations of program
updProgFuncs
:: ([AFuncDecl a] -> [AFuncDecl a]) -> AProg a -> AProg a
update functions of program
updProgOps
:: ([OpDecl] -> [OpDecl]) -> AProg a -> AProg a
update infix operators of program
allVarsInProg
:: AProg a -> [Int]
get all program variables (also from patterns)
updProgExps
:: (AExpr a -> AExpr a) -> AProg a -> AProg a
lift transformation on expressions to program
rnmAllVarsInProg
:: (Int -> Int) -> AProg a -> AProg a
rename programs variables
updQNamesInProg
:: ((String, String) -> (String, String)) -> AProg a -> AProg a
update all qualified names in program
rnmProg
:: String -> AProg a -> AProg a
rename program (update name of and all qualified names in program)
trType
:: ((String, String) -> Visibility -> [(Int, Kind)] -> [ConsDecl] -> a) -> ((String, String) -> Visibility -> [(Int, Kind)] -> TypeExpr -> a) -> ((String, String) -> Visibility -> [(Int, Kind)] -> NewConsDecl -> a) -> TypeDecl -> a
transform type declaration
typeName
:: TypeDecl -> (String, String)
get name of type declaration
typeVisibility
:: TypeDecl -> Visibility
get visibility of type declaration
typeParams
:: TypeDecl -> [(Int, Kind)]
get type parameters of type declaration
typeConsDecls
:: TypeDecl -> [ConsDecl]
get constructor declarations from type declaration
typeSyn
:: TypeDecl -> TypeExpr
get synonym of type declaration
isTypeData
:: TypeDecl -> Bool
is type declaration a basic data type?
is type declaration a type synonym?
is type declaration a newtype?
updType
:: ((String, String) -> (String, String)) -> (Visibility -> Visibility) -> ([(Int, Kind)] -> [(Int, Kind)]) -> ([ConsDecl] -> [ConsDecl]) -> (NewConsDecl -> NewConsDecl) -> (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl
update type declaration
updTypeName
:: ((String, String) -> (String, String)) -> TypeDecl -> TypeDecl
update name of type declaration
updTypeVisibility
:: (Visibility -> Visibility) -> TypeDecl -> TypeDecl
update visibility of type declaration
updTypeParams
:: ([(Int, Kind)] -> [(Int, Kind)]) -> TypeDecl -> TypeDecl
update type parameters of type declaration
updTypeConsDecls
:: ([ConsDecl] -> [ConsDecl]) -> TypeDecl -> TypeDecl
update constructor declarations of type declaration
updTypeNewConsDecl
:: (NewConsDecl -> NewConsDecl) -> TypeDecl -> TypeDecl
update newtype constructor declaration of type declaration
updTypeSynonym
:: (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl
update synonym of type declaration
updQNamesInType
:: ((String, String) -> (String, String)) -> TypeDecl -> TypeDecl
update all qualified names in type declaration
trCons
:: ((String, String) -> Int -> Visibility -> [TypeExpr] -> a) -> ConsDecl -> a
transform constructor declaration
consName
:: ConsDecl -> (String, String)
get name of constructor declaration
get arity of constructor declaration
consVisibility
:: ConsDecl -> Visibility
get visibility of constructor declaration
consArgs
:: ConsDecl -> [TypeExpr]
get arguments of constructor declaration
updCons
:: ((String, String) -> (String, String)) -> (Int -> Int) -> (Visibility -> Visibility) -> ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl
update constructor declaration
updConsName
:: ((String, String) -> (String, String)) -> ConsDecl -> ConsDecl
update name of constructor declaration
updConsArity
:: (Int -> Int) -> ConsDecl -> ConsDecl
update arity of constructor declaration
updConsVisibility
:: (Visibility -> Visibility) -> ConsDecl -> ConsDecl
update visibility of constructor declaration
updConsArgs
:: ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl
update arguments of constructor declaration
updQNamesInConsDecl
:: ((String, String) -> (String, String)) -> ConsDecl -> ConsDecl
update all qualified names in constructor declaration
trNewCons
:: ((String, String) -> Visibility -> TypeExpr -> a) -> NewConsDecl -> a
transform newtype constructor declaration
newConsArg
:: NewConsDecl -> TypeExpr
newConsName
:: NewConsDecl -> (String, String)
newConsVisibility
:: NewConsDecl -> Visibility
updNewCons
:: ((String, String) -> (String, String)) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> NewConsDecl -> NewConsDecl
update newtype constructor declaration
updNewConsName
:: ((String, String) -> (String, String)) -> NewConsDecl -> NewConsDecl
update name of newtype constructor declaration
updNewConsVisibility
:: (Visibility -> Visibility) -> NewConsDecl -> NewConsDecl
update visibility of newtype constructor declaration
updNewConsArg
:: (TypeExpr -> TypeExpr) -> NewConsDecl -> NewConsDecl
update argument of newtype constructor declaration
updQNamesInNewConsDecl
:: ((String, String) -> (String, String)) -> NewConsDecl -> NewConsDecl
get index from type variable
domain
:: TypeExpr -> TypeExpr
get domain from functional type
get range from functional type
tConsName
:: TypeExpr -> (String, String)
get name from constructed type
tConsArgs
:: TypeExpr -> [TypeExpr]
get arguments from constructed type
trTypeExpr
:: (Int -> a) -> ((String, String) -> [a] -> a) -> (a -> a -> a) -> ([(Int, Kind)] -> a -> a) -> TypeExpr -> a
transform type expression
is type expression a type variable?
is type declaration a constructed type?
isFuncType
:: TypeExpr -> Bool
is type declaration a functional type?
isForallType
:: TypeExpr -> Bool
is type declaration a forall type?
updTVars
:: (Int -> TypeExpr) -> TypeExpr -> TypeExpr
update all type variables
updTCons
:: ((String, String) -> [TypeExpr] -> TypeExpr) -> TypeExpr -> TypeExpr
update all type constructors
updFuncTypes
:: (TypeExpr -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr
update all functional types
updForallTypes
:: ([(Int, Kind)] -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr
update all forall types
argTypes
:: TypeExpr -> [TypeExpr]
get argument types from functional type
resultType
:: TypeExpr -> TypeExpr
get result type from (nested) functional type
rnmAllVarsInTypeExpr
:: (Int -> Int) -> TypeExpr -> TypeExpr
rename variables in type expression
updQNamesInTypeExpr
:: ((String, String) -> (String, String)) -> TypeExpr -> TypeExpr
update all qualified names in type expression
trOp
:: ((String, String) -> Fixity -> Int -> a) -> OpDecl -> a
transform operator declaration
opName
:: OpDecl -> (String, String)
get name from operator declaration
get fixity of operator declaration
opPrecedence
:: OpDecl -> Int
get precedence of operator declaration
updOp
:: ((String, String) -> (String, String)) -> (Fixity -> Fixity) -> (Int -> Int) -> OpDecl -> OpDecl
update operator declaration
updOpName
:: ((String, String) -> (String, String)) -> OpDecl -> OpDecl
update name of operator declaration
updOpFixity
:: (Fixity -> Fixity) -> OpDecl -> OpDecl
update fixity of operator declaration
updOpPrecedence
:: (Int -> Int) -> OpDecl -> OpDecl
update precedence of operator declaration
trFunc
:: ((String, String) -> Int -> Visibility -> TypeExpr -> ARule a -> b) -> AFuncDecl a -> b
transform function
funcName
:: AFuncDecl a -> (String, String)
get name of function
funcArity
:: AFuncDecl a -> Int
get arity of function
funcVisibility
:: AFuncDecl a -> Visibility
get visibility of function
funcType
:: AFuncDecl a -> TypeExpr
get type of function
funcRule
:: AFuncDecl a -> ARule a
get rule of function
updFunc
:: ((String, String) -> (String, String)) -> (Int -> Int) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> (ARule a -> ARule a) -> AFuncDecl a -> AFuncDecl a
update function
updFuncName
:: ((String, String) -> (String, String)) -> AFuncDecl a -> AFuncDecl a
update name of function
updFuncArity
:: (Int -> Int) -> AFuncDecl a -> AFuncDecl a
update arity of function
updFuncVisibility
:: (Visibility -> Visibility) -> AFuncDecl a -> AFuncDecl a
update visibility of function
updFuncType
:: (TypeExpr -> TypeExpr) -> AFuncDecl a -> AFuncDecl a
update type of function
updFuncRule
:: (ARule a -> ARule a) -> AFuncDecl a -> AFuncDecl a
update rule of function
isExternal
:: AFuncDecl a -> Bool
is function externally defined?
allVarsInFunc
:: AFuncDecl a -> [Int]
get variable names in a function declaration
funcArgs
:: AFuncDecl a -> [(Int, a)]
get arguments of function, if not externally defined
funcBody
:: AFuncDecl a -> AExpr a
get body of function, if not externally defined
funcRHS
:: AFuncDecl a -> [AExpr a]
rnmAllVarsInFunc
:: (Int -> Int) -> AFuncDecl a -> AFuncDecl a
rename all variables in function
updQNamesInFunc
:: ((String, String) -> (String, String)) -> AFuncDecl a -> AFuncDecl a
update all qualified names in function
updFuncArgs
:: ([(Int, a)] -> [(Int, a)]) -> AFuncDecl a -> AFuncDecl a
update arguments of function, if not externally defined
updFuncBody
:: (AExpr a -> AExpr a) -> AFuncDecl a -> AFuncDecl a
update body of function, if not externally defined
trRule
:: (a -> [(Int, a)] -> AExpr a -> b) -> (a -> String -> b) -> ARule a -> b
transform rule
ruleArgs
:: ARule a -> [(Int, a)]
get rules arguments if it's not external
ruleBody
:: ARule a -> AExpr a
get rules body if it's not external
ruleExtDecl
:: ARule a -> String
get rules external declaration
isRuleExternal
:: ARule a -> Bool
is rule external?
updRule
:: (a -> a) -> ([(Int, a)] -> [(Int, a)]) -> (AExpr a -> AExpr a) -> (String -> String) -> ARule a -> ARule a
update rule
updRuleArgs
:: ([(Int, a)] -> [(Int, a)]) -> ARule a -> ARule a
update rules arguments
updRuleBody
:: (AExpr a -> AExpr a) -> ARule a -> ARule a
update rules body
updRuleExtDecl
:: (String -> String) -> ARule a -> ARule a
update rules external declaration
allVarsInRule
:: ARule a -> [Int]
get variable names in a functions rule
rnmAllVarsInRule
:: (Int -> Int) -> ARule a -> ARule a
rename all variables in rule
updQNamesInRule
:: ((String, String) -> (String, String)) -> ARule a -> ARule a
update all qualified names in rule
trCombType
:: a -> (Int -> a) -> a -> (Int -> a) -> CombType -> a
transform combination type
isCombTypeFuncCall
:: CombType -> Bool
is type of combination FuncCall?
isCombTypeFuncPartCall
:: CombType -> Bool
is type of combination FuncPartCall?
isCombTypeConsCall
:: CombType -> Bool
is type of combination ConsCall?
isCombTypeConsPartCall
:: CombType -> Bool
is type of combination ConsPartCall?
missingArgs
:: CombType -> Int
get internal number of variable
get literal if expression is literal expression
combType
:: AExpr a -> CombType
get combination type of a combined expression
combName
:: AExpr a -> (String, String)
get name of a combined expression
combArgs
:: AExpr a -> [AExpr a]
get arguments of a combined expression
missingCombArgs
:: AExpr a -> Int
get number of missing arguments if expression is combined
letBinds
:: AExpr a -> [((Int, a), AExpr a)]
get indices of variables in let declaration
get body of let declaration
get variable indices from declaration of free variables
freeExpr
:: AExpr a -> AExpr a
get expression from declaration of free variables
orExps
:: AExpr a -> [AExpr a]
get expressions from or-expression
caseType
:: AExpr a -> CaseType
get case-type of case expression
caseExpr
:: AExpr a -> AExpr a
get scrutinee of case expression
caseBranches
:: AExpr a -> [ABranchExpr a]
get branch expressions from case expression
is expression a variable?
is expression a literal expression?
is expression combined?
is expression a let expression?
is expression a declaration of free variables?
is expression an or-expression?
is expression a case expression?
trExpr
:: (a -> Int -> b) -> (a -> Literal -> b) -> (a -> CombType -> ((String, String), a) -> [b] -> b) -> (a -> [((Int, a), b)] -> b -> b) -> (a -> [(Int, a)] -> b -> b) -> (a -> b -> b -> b) -> (a -> CaseType -> b -> [c] -> b) -> (APattern a -> b -> c) -> (a -> b -> TypeExpr -> b) -> AExpr a -> b
transform expression
updVars
:: (a -> Int -> AExpr a) -> AExpr a -> AExpr a
update all variables in given expression
updLiterals
:: (a -> Literal -> AExpr a) -> AExpr a -> AExpr a
update all literals in given expression
updCombs
:: (a -> CombType -> ((String, String), a) -> [AExpr a] -> AExpr a) -> AExpr a -> AExpr a
update all combined expressions in given expression
updLets
:: (a -> [((Int, a), AExpr a)] -> AExpr a -> AExpr a) -> AExpr a -> AExpr a
update all let expressions in given expression
updFrees
:: (a -> [(Int, a)] -> AExpr a -> AExpr a) -> AExpr a -> AExpr a
update all free declarations in given expression
updOrs
:: (a -> AExpr a -> AExpr a -> AExpr a) -> AExpr a -> AExpr a
update all or expressions in given expression
updCases
:: (a -> CaseType -> AExpr a -> [ABranchExpr a] -> AExpr a) -> AExpr a -> AExpr a
update all case expressions in given expression
updBranches
:: (APattern a -> AExpr a -> ABranchExpr a) -> AExpr a -> AExpr a
update all case branches in given expression
updTypeds
:: (a -> AExpr a -> TypeExpr -> AExpr a) -> AExpr a -> AExpr a
update all typed expressions in given expression
isFuncCall
:: AExpr a -> Bool
is expression a call of a function where all arguments are provided?
isFuncPartCall
:: AExpr a -> Bool
is expression a partial function call?
isConsCall
:: AExpr a -> Bool
is expression a call of a constructor?
isConsPartCall
:: AExpr a -> Bool
is expression a partial constructor call?
is expression fully evaluated?
get all variables (also pattern variables) in expression
rnmAllVars
:: (Int -> Int) -> AExpr a -> AExpr a
rename all variables (also in patterns) in expression
updQNames
:: ((String, String) -> (String, String)) -> AExpr a -> AExpr a
update all qualified names in expression
trBranch
:: (APattern a -> AExpr a -> b) -> ABranchExpr a -> b
transform branch expression
branchPattern
:: ABranchExpr a -> APattern a
get pattern from branch expression
branchExpr
:: ABranchExpr a -> AExpr a
get expression from branch expression
updBranch
:: (APattern a -> APattern a) -> (AExpr a -> AExpr a) -> ABranchExpr a -> ABranchExpr a
update branch expression
updBranchPattern
:: (APattern a -> APattern a) -> ABranchExpr a -> ABranchExpr a
update pattern of branch expression
updBranchExpr
:: (AExpr a -> AExpr a) -> ABranchExpr a -> ABranchExpr a
update expression of branch expression
trPattern
:: (a -> ((String, String), a) -> [(Int, a)] -> b) -> (a -> Literal -> b) -> APattern a -> b
transform pattern
patCons
:: APattern a -> (String, String)
get name from constructor pattern
patArgs
:: APattern a -> [(Int, a)]
get arguments from constructor pattern
patLiteral
:: APattern a -> Literal
get literal from literal pattern
isConsPattern
:: APattern a -> Bool
is pattern a constructor pattern?
updPattern
:: (((String, String), a) -> ((String, String), a)) -> ([(Int, a)] -> [(Int, a)]) -> (Literal -> Literal) -> APattern a -> APattern a
update pattern
updPatCons
:: ((String, String) -> (String, String)) -> APattern a -> APattern a
update constructors name of pattern
updPatArgs
:: ([(Int, a)] -> [(Int, a)]) -> APattern a -> APattern a
update arguments of constructor pattern
updPatLiteral
:: (Literal -> Literal) -> APattern a -> APattern a
update literal of pattern
patExpr
:: APattern a -> AExpr a
build expression from pattern
Extract the annotation of an annotated expression.
annPattern
:: APattern a -> a
Extract the annotation of an annotated pattern.
unAnnFuncDecl
:: AFuncDecl a -> FuncDecl
Remove annotation from an expression.
Since there is no information about the types of free and let-bound variables
available, the artificial type Prelude.UNKNONW
is inserted for them.
unAnnPattern
:: APattern a -> Pattern