|
| Data.Generics.Strafunski.StrategyLib.RefactoringTheme | | Portability | portable | | Stability | experimental | | Maintainer | Ralf Laemmel, Joost Visser |
|
|
|
|
|
| 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.
|
|
| Synopsis |
|
| 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 | | | | 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 where |
| Class of abstractions
| | | Methods | | 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 |
|
|
|
| Removal
|
|
| eliminate |
| :: (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
|
|
| introduce |
| :: (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)
|
|
| extract |
| :: (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
|
|
|
| Produced by Haddock version 0.8 |