Safe Haskell | None |
---|
- module Language.KURE
- module Language.KURE.Injection
- data KureM a
- runKureM :: (a -> b) -> (String -> b) -> KureM a -> b
- fromKureM :: (String -> a) -> KureM a -> a
- type TranslateH a b = Translate HermitC HermitM a b
- type RewriteH a = Rewrite HermitC HermitM a
- type LensH a b = Lens HermitC HermitM a b
- idR :: RewriteH a
- modGutsT :: TranslateH CoreProg a -> (ModGuts -> a -> b) -> TranslateH ModGuts b
- modGutsR :: RewriteH CoreProg -> RewriteH ModGuts
- progNilT :: b -> TranslateH CoreProg b
- progConsT :: TranslateH CoreBind a1 -> TranslateH CoreProg a2 -> (a1 -> a2 -> b) -> TranslateH CoreProg b
- progConsAllR :: RewriteH CoreBind -> RewriteH CoreProg -> RewriteH CoreProg
- progConsAnyR :: RewriteH CoreBind -> RewriteH CoreProg -> RewriteH CoreProg
- progConsOneR :: RewriteH CoreBind -> RewriteH CoreProg -> RewriteH CoreProg
- nonRecT :: TranslateH CoreExpr a -> (Var -> a -> b) -> TranslateH CoreBind b
- nonRecR :: RewriteH CoreExpr -> RewriteH CoreBind
- recT :: (Int -> TranslateH CoreDef a) -> ([a] -> b) -> TranslateH CoreBind b
- recAllR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBind
- recAnyR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBind
- recOneR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBind
- defT :: TranslateH CoreExpr a -> (Id -> a -> b) -> TranslateH CoreDef b
- defR :: RewriteH CoreExpr -> RewriteH CoreDef
- altT :: TranslateH CoreExpr a -> (AltCon -> [Id] -> a -> b) -> TranslateH CoreAlt b
- altR :: RewriteH CoreExpr -> RewriteH CoreAlt
- varT :: (Var -> b) -> TranslateH CoreExpr b
- litT :: (Literal -> b) -> TranslateH CoreExpr b
- appT :: TranslateH CoreExpr a1 -> TranslateH CoreExpr a2 -> (a1 -> a2 -> b) -> TranslateH CoreExpr b
- appAllR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- appAnyR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- appOneR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- lamT :: TranslateH CoreExpr a -> (Var -> a -> b) -> TranslateH CoreExpr b
- lamR :: RewriteH CoreExpr -> RewriteH CoreExpr
- letT :: TranslateH CoreBind a1 -> TranslateH CoreExpr a2 -> (a1 -> a2 -> b) -> TranslateH CoreExpr b
- letAllR :: RewriteH CoreBind -> RewriteH CoreExpr -> RewriteH CoreExpr
- letAnyR :: RewriteH CoreBind -> RewriteH CoreExpr -> RewriteH CoreExpr
- letOneR :: RewriteH CoreBind -> RewriteH CoreExpr -> RewriteH CoreExpr
- caseT :: TranslateH CoreExpr a1 -> (Int -> TranslateH CoreAlt a2) -> (a1 -> Id -> Type -> [a2] -> b) -> TranslateH CoreExpr b
- caseAllR :: RewriteH CoreExpr -> (Int -> RewriteH CoreAlt) -> RewriteH CoreExpr
- caseAnyR :: RewriteH CoreExpr -> (Int -> RewriteH CoreAlt) -> RewriteH CoreExpr
- caseOneR :: RewriteH CoreExpr -> (Int -> RewriteH CoreAlt) -> RewriteH CoreExpr
- castT :: TranslateH CoreExpr a -> (a -> Coercion -> b) -> TranslateH CoreExpr b
- castR :: RewriteH CoreExpr -> RewriteH CoreExpr
- tickT :: TranslateH CoreExpr a -> (CoreTickish -> a -> b) -> TranslateH CoreExpr b
- tickR :: RewriteH CoreExpr -> RewriteH CoreExpr
- typeT :: (Type -> b) -> TranslateH CoreExpr b
- coercionT :: (Coercion -> b) -> TranslateH CoreExpr b
- recDefT :: (Int -> TranslateH CoreExpr a1) -> ([(Id, a1)] -> b) -> TranslateH CoreBind b
- recDefAllR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreBind
- recDefAnyR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreBind
- recDefOneR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreBind
- letNonRecT :: TranslateH CoreExpr a1 -> TranslateH CoreExpr a2 -> (Var -> a1 -> a2 -> b) -> TranslateH CoreExpr b
- letNonRecAllR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- letNonRecAnyR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- letNonRecOneR :: RewriteH CoreExpr -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecT :: (Int -> TranslateH CoreDef a1) -> TranslateH CoreExpr a2 -> ([a1] -> a2 -> b) -> TranslateH CoreExpr b
- letRecAllR :: (Int -> RewriteH CoreDef) -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecAnyR :: (Int -> RewriteH CoreDef) -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecOneR :: (Int -> RewriteH CoreDef) -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecDefT :: (Int -> TranslateH CoreExpr a1) -> TranslateH CoreExpr a2 -> ([(Id, a1)] -> a2 -> b) -> TranslateH CoreExpr b
- letRecDefAllR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecDefAnyR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr -> RewriteH CoreExpr
- letRecDefOneR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr -> RewriteH CoreExpr
- consNonRecT :: TranslateH CoreExpr a1 -> TranslateH CoreProg a2 -> (Var -> a1 -> a2 -> b) -> TranslateH CoreProg b
- consNonRecAllR :: RewriteH CoreExpr -> RewriteH CoreProg -> RewriteH CoreProg
- consNonRecAnyR :: RewriteH CoreExpr -> RewriteH CoreProg -> RewriteH CoreProg
- consNonRecOneR :: RewriteH CoreExpr -> RewriteH CoreProg -> RewriteH CoreProg
- consRecT :: (Int -> TranslateH CoreDef a1) -> TranslateH CoreProg a2 -> ([a1] -> a2 -> b) -> TranslateH CoreProg b
- consRecAllR :: (Int -> RewriteH CoreDef) -> RewriteH CoreProg -> RewriteH CoreProg
- consRecAnyR :: (Int -> RewriteH CoreDef) -> RewriteH CoreProg -> RewriteH CoreProg
- consRecOneR :: (Int -> RewriteH CoreDef) -> RewriteH CoreProg -> RewriteH CoreProg
- consRecDefT :: (Int -> TranslateH CoreExpr a1) -> TranslateH CoreProg a2 -> ([(Id, a1)] -> a2 -> b) -> TranslateH CoreProg b
- consRecDefAllR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreProg -> RewriteH CoreProg
- consRecDefAnyR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreProg -> RewriteH CoreProg
- consRecDefOneR :: (Int -> RewriteH CoreExpr) -> RewriteH CoreProg -> RewriteH CoreProg
- caseAltT :: TranslateH CoreExpr a1 -> (Int -> TranslateH CoreExpr a2) -> (a1 -> Id -> Type -> [(AltCon, [Id], a2)] -> b) -> TranslateH CoreExpr b
- caseAltAllR :: RewriteH CoreExpr -> (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr
- caseAltAnyR :: RewriteH CoreExpr -> (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr
- caseAltOneR :: RewriteH CoreExpr -> (Int -> RewriteH CoreExpr) -> RewriteH CoreExpr
- promoteModGutsR :: RewriteH ModGuts -> RewriteH Core
- promoteProgR :: RewriteH CoreProg -> RewriteH Core
- promoteBindR :: RewriteH CoreBind -> RewriteH Core
- promoteDefR :: RewriteH CoreDef -> RewriteH Core
- promoteExprR :: RewriteH CoreExpr -> RewriteH Core
- promoteAltR :: RewriteH CoreAlt -> RewriteH Core
- promoteModGutsT :: TranslateH ModGuts b -> TranslateH Core b
- promoteProgT :: TranslateH CoreProg b -> TranslateH Core b
- promoteBindT :: TranslateH CoreBind b -> TranslateH Core b
- promoteDefT :: TranslateH CoreDef b -> TranslateH Core b
- promoteExprT :: TranslateH CoreExpr b -> TranslateH Core b
- promoteAltT :: TranslateH CoreAlt b -> TranslateH Core b
KURE Modules
All the required functionality of KURE is exported here, so other modules do not need to import KURE directly.
module Language.KURE
module Language.KURE.Injection
data KureM a
KureM
is a basic error Monad
.
The KURE user is free to either use KureM
or provide their own monad.
KureM
is essentially the same as (Either
String
a
), except that the fail
method produces an error in the monad,
rather than invoking error
.
A major advantage of this is that monadic pattern match failures are caught safely.
fromKureM :: (String -> a) -> KureM a -> a
Get the value from a KureM
, providing a function to handle the error case.
Synonyms
type TranslateH a b = Translate HermitC HermitM a bSource
A synonym for the identity rewrite. Convienient to avoid importing Control.Category.
Congruence combinators
Modguts
modGutsT :: TranslateH CoreProg a -> (ModGuts -> a -> b) -> TranslateH ModGuts bSource
Translate a module. Slightly different to the other congruence combinators: it passes in *all* of the original to the reconstruction function.
Program
progNilT :: b -> TranslateH CoreProg bSource
Translate an empty list.
progConsT :: TranslateH CoreBind a1 -> TranslateH CoreProg a2 -> (a1 -> a2 -> b) -> TranslateH CoreProg bSource
Binding Groups
nonRecT :: TranslateH CoreExpr a -> (Var -> a -> b) -> TranslateH CoreBind bSource
recT :: (Int -> TranslateH CoreDef a) -> ([a] -> b) -> TranslateH CoreBind bSource
Translate a binding group of the form: Rec
[CoreDef
]
recAllR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBindSource
Rewrite all children of a binding group of the form: Rec
[CoreDef
]
recAnyR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBindSource
Rewrite any children of a binding group of the form: Rec
[CoreDef
]
recOneR :: (Int -> RewriteH CoreDef) -> RewriteH CoreBindSource
Rewrite one child of a binding group of the form: Rec
[CoreDef
]
Recursive Definitions
defT :: TranslateH CoreExpr a -> (Id -> a -> b) -> TranslateH CoreDef bSource
Case Alternatives
altT :: TranslateH CoreExpr a -> (AltCon -> [Id] -> a -> b) -> TranslateH CoreAlt bSource
Expressions
litT :: (Literal -> b) -> TranslateH CoreExpr bSource
Translate an expression of the form: Lit
Literal
appT :: TranslateH CoreExpr a1 -> TranslateH CoreExpr a2 -> (a1 -> a2 -> b) -> TranslateH CoreExpr bSource
lamT :: TranslateH CoreExpr a -> (Var -> a -> b) -> TranslateH CoreExpr bSource
letT :: TranslateH CoreBind a1 -> TranslateH CoreExpr a2 -> (a1 -> a2 -> b) -> TranslateH CoreExpr bSource
caseT :: TranslateH CoreExpr a1 -> (Int -> TranslateH CoreAlt a2) -> (a1 -> Id -> Type -> [a2] -> b) -> TranslateH CoreExpr bSource
castT :: TranslateH CoreExpr a -> (a -> Coercion -> b) -> TranslateH CoreExpr bSource
tickT :: TranslateH CoreExpr a -> (CoreTickish -> a -> b) -> TranslateH CoreExpr bSource
Translate an expression of the form: Tick
CoreTickish
CoreExpr
tickR :: RewriteH CoreExpr -> RewriteH CoreExprSource
Rewrite the CoreExpr
child of an expression of the form: Tick
CoreTickish
CoreExpr
coercionT :: (Coercion -> b) -> TranslateH CoreExpr bSource
Translate an expression of the form: Coercion
Coercion
Composite Congruence Combinators
recDefT :: (Int -> TranslateH CoreExpr a1) -> ([(Id, a1)] -> b) -> TranslateH CoreBind bSource
letNonRecT :: TranslateH CoreExpr a1 -> TranslateH CoreExpr a2 -> (Var -> a1 -> a2 -> b) -> TranslateH CoreExpr bSource
letRecT :: (Int -> TranslateH CoreDef a1) -> TranslateH CoreExpr a2 -> ([a1] -> a2 -> b) -> TranslateH CoreExpr bSource
letRecDefT :: (Int -> TranslateH CoreExpr a1) -> TranslateH CoreExpr a2 -> ([(Id, a1)] -> a2 -> b) -> TranslateH CoreExpr bSource
consNonRecT :: TranslateH CoreExpr a1 -> TranslateH CoreProg a2 -> (Var -> a1 -> a2 -> b) -> TranslateH CoreProg bSource
consRecT :: (Int -> TranslateH CoreDef a1) -> TranslateH CoreProg a2 -> ([a1] -> a2 -> b) -> TranslateH CoreProg bSource
consRecDefT :: (Int -> TranslateH CoreExpr a1) -> TranslateH CoreProg a2 -> ([(Id, a1)] -> a2 -> b) -> TranslateH CoreProg bSource
caseAltT :: TranslateH CoreExpr a1 -> (Int -> TranslateH CoreExpr a2) -> (a1 -> Id -> Type -> [(AltCon, [Id], a2)] -> b) -> TranslateH CoreExpr bSource
Promotion Combinators
Rewrite Promotions
Translate Promotions
promoteModGutsT :: TranslateH ModGuts b -> TranslateH Core bSource
promoteProgT :: TranslateH CoreProg b -> TranslateH Core bSource
promoteBindT :: TranslateH CoreBind b -> TranslateH Core bSource
promoteDefT :: TranslateH CoreDef b -> TranslateH Core bSource
promoteExprT :: TranslateH CoreExpr b -> TranslateH Core bSource
promoteAltT :: TranslateH CoreAlt b -> TranslateH Core bSource