This module contains an implementation of a case lifter, i.e., an operation which lifts all nested cases (and also nested lets) in a FlatCurry program into new operations.
NOTE: the new operations contain nonsense types, i.e., this transformation should only be used if the actual function types are irrelevant!
Author: Michael Hanus
Version: February 2020
                defaultLiftOpts
                  ::  LiftOptions   
                Default options for lifting all nested case/let/free expressions.  | 
              
            
                defaultNoLiftOpts
                  ::  LiftOptions   
                Default options for lifting no nested case/let/free expression.  | 
              
            
                getOpts
                  ::  State LiftState LiftOptions   
                 | 
              
            
                genFuncName
                  ::  String -> State LiftState (String,String)   
                 | 
              
            
                addFun2State
                  ::  FuncDecl -> LiftState -> LiftState   
                 | 
              
            
                liftProg
                  ::  LiftOptions -> Prog -> Prog   
                Lift nested cases/lets/free in a FlatCurry program (w.r.t.  | 
              
            
                liftTopFun
                  ::  FuncDecl -> State LiftState [FuncDecl]   
                 | 
              
            
                liftNewFun
                  ::  FuncDecl -> State LiftState FuncDecl   
                 | 
              
            
                liftRule
                  ::  Rule -> State LiftState Rule   
                 | 
              
            
                liftExp
                  ::  Bool -> Expr -> State LiftState Expr   
                 | 
              
            
                unboundVars
                  ::  Expr -> [Int]   
                Find all variables which are not bound in an expression.  | 
              
            
                unboundVarsInBranch
                  ::  BranchExpr -> [Int]   
                 | 
              
            
                unionMap
                  :: Eq a => (b -> [a]) -> [b] -> [a]   
                 | 
              
            
Options for case/let/free lifting.
Constructors:
LiftOptions
                    ::  Bool ->  Bool -> LiftOptions
                Fields:
liftCase
                        :: Bool
                  liftCArg
                        :: Bool
                  Options for case/let/free lifting.
Constructors:
LiftState
                    ::  LiftOptions ->  String ->  [String] ->  [FuncDecl] ->  String ->  Int -> LiftState
                Fields:
liftOpts
                        :: LiftOptions
                  currMod
                        :: String
                  topFuncs
                        :: [String]
                  liftFuncs
                        :: [FuncDecl]
                  currFunc
                        :: String
                  currIndex
                        :: Int
                  
              Type synonym: LiftingState a = State LiftState a
            
| 
                    
                     
                       Default options for lifting all nested case/let/free expressions. 
  | 
                  
                
| 
                    
                     
                       Default options for lifting no nested case/let/free expression. 
  | 
                  
                
| 
                    
                     
                        | 
                  
                
| 
                    
                     
                       
  | 
                  
                
| 
                    
                     
                       Lift nested cases/lets/free in a FlatCurry program (w.r.t. options).  | 
                  
                
| 
                    
                     
                        | 
                  
                
| 
                    
                     
                        | 
                  
                
| 
                    
                     
                       Find all variables which are not bound in an expression.  | 
                  
                
| 
                    
                     
                        | 
                  
                
| 
                    
                     
                        |