module HERMIT.Dictionary.Unsafe ( externals , unsafeReplaceR , unsafeReplaceStashR ) where import Control.Monad import HERMIT.Core import HERMIT.Kure import HERMIT.GHC import HERMIT.Monad import HERMIT.External import HERMIT.ParserCore import Prelude hiding (exp) ------------------------------------------------------------------------ externals :: [External] externals = map (.+ Unsafe) [ external "unsafe-replace" (promoteExprR . unsafeReplaceR :: CoreString -> RewriteH Core) [ "replace the currently focused expression with a new expression" ] , external "unsafe-replace" (promoteExprR . unsafeReplaceStashR :: String -> RewriteH Core) [ "replace the currently focused expression with an expression from the stash" , "DOES NOT ensure expressions have the same type, or that free variables in the replacement expression are in scope" ] ] ------------------------------------------------------------------------ unsafeReplaceR :: CoreString -> RewriteH CoreExpr unsafeReplaceR core = translate $ \ c e -> do e' <- parseCore core c guardMsg (eqType (exprKindOrType e) (exprKindOrType e')) "expression types differ." return e' unsafeReplaceStashR :: String -> RewriteH CoreExpr unsafeReplaceStashR label = prefixFailMsg "unsafe-replace failed: " $ contextfreeT $ \ e -> do Def _ rhs <- lookupDef label guardMsg (eqType (exprKindOrType e) (exprKindOrType rhs)) "expression types differ." return rhs ------------------------------------------------------------------------