| Portability | portable | 
|---|---|
| Stability | experimental | 
| Maintainer | Ralf Laemmel, Joost Visser | 
| Safe Haskell | None | 
Data.Generics.Strafunski.StrategyLib.RefactoringTheme
Description
This module is part of StrategyLib, a library of functional strategy
 combinators, including combinators for generic traversal. This module 
 defines generic refactoring functionality. See the paper Towards
 Generic Refactoring by Ralf Laemmel. See also 
 generic-refactoring in the examples directory.
- class (Term abstr, Eq name, Term [abstr], Term apply) => Abstraction abstr name tpe apply | abstr -> name, abstr -> tpe, abstr -> apply, apply -> name, apply -> abstr where
- getAbstrName :: abstr -> Maybe name
 - getAbstrParas :: abstr -> Maybe [(name, tpe)]
 - getAbstrBody :: abstr -> Maybe apply
 - getApplyName :: apply -> Maybe name
 - getApplyParas :: apply -> Maybe [(name, tpe)]
 - constrAbstr :: name -> [(name, tpe)] -> apply -> Maybe abstr
 - constrApply :: name -> [(name, tpe)] -> Maybe apply
 
 - eliminate :: (Term prog, Abstraction abstr name tpe apply) => TU [(name, tpe)] Identity -> TU [name] Identity -> (abstr -> Maybe abstr) -> prog -> Maybe prog
 - introduce :: (Term prog, Abstraction abstr name tpe apply) => TU [(name, tpe)] Identity -> TU [name] Identity -> ([abstr] -> Maybe [abstr]) -> abstr -> prog -> Maybe prog
 - extract :: (Term prog, Abstraction abstr name tpe apply) => TU [(name, tpe)] Identity -> TU [name] Identity -> (apply -> Maybe apply) -> ([abstr] -> [abstr]) -> ([abstr] -> Maybe [abstr]) -> ([(name, tpe)] -> apply -> Bool) -> name -> prog -> Maybe prog
 
The abstraction interface
class (Term abstr, Eq name, Term [abstr], Term apply) => Abstraction abstr name tpe apply | abstr -> name, abstr -> tpe, abstr -> apply, apply -> name, apply -> abstr whereSource
Class of abstractions
Methods
getAbstrName :: abstr -> Maybe nameSource
getAbstrParas :: abstr -> Maybe [(name, tpe)]Source
getAbstrBody :: abstr -> Maybe applySource
getApplyName :: apply -> Maybe nameSource
getApplyParas :: apply -> Maybe [(name, tpe)]Source
constrAbstr :: name -> [(name, tpe)] -> apply -> Maybe abstrSource
constrApply :: name -> [(name, tpe)] -> Maybe applySource
Removal
Arguments
| :: (Term prog, Abstraction abstr name tpe apply) | |
| => TU [(name, tpe)] Identity | Identify declarations  | 
| -> TU [name] Identity | Identify references  | 
| -> (abstr -> Maybe abstr) | Unwrap abstraction  | 
| -> prog | Input program  | 
| -> Maybe prog | Output program  | 
Remove an unused abstraction
Insertion
Arguments
| :: (Term prog, Abstraction abstr name tpe apply) | |
| => TU [(name, tpe)] Identity | Identify declarations  | 
| -> TU [name] Identity | Identify references  | 
| -> ([abstr] -> Maybe [abstr]) | Unwrap scope with abstractions  | 
| -> abstr | Abstraction to be inserted  | 
| -> prog | Input program  | 
| -> Maybe prog | Output program  | 
Insert a new abstraction
Generic extraction (say fold)
Arguments
| :: (Term prog, Abstraction abstr name tpe apply) | |
| => TU [(name, tpe)] Identity | Identify declarations  | 
| -> TU [name] Identity | Identify references  | 
| -> (apply -> Maybe apply) | Unwrap focus  | 
| -> ([abstr] -> [abstr]) | Wrap host  | 
| -> ([abstr] -> Maybe [abstr]) | Unwrap host  | 
| -> ([(name, tpe)] -> apply -> Bool) | Check focus  | 
| -> name | Name for abstraction  | 
| -> prog | Input program  | 
| -> Maybe prog | Output program  | 
Extract an abstraction