Strafunski-StrategyLib-5.0.0.3: Library for strategic programming

Portabilityportable
Stabilityexperimental
MaintainerRalf Laemmel, Joost Visser
Safe HaskellNone

Data.Generics.Strafunski.StrategyLib.RefactoringTheme

Contents

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

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

eliminateSource

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

introduceSource

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)

extractSource

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