content: module HomePackagePlugin where
  
  import GHC.Plugins
  
  plugin :: Plugin
  plugin = defaultPlugin {
          installCoreToDos = install
      }
  
  install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
  install _options todos = do
      return $ (CoreDoPluginPass "String replacement" $ bindsOnlyPass stringReplacementPass) : todos
  
  stringReplacementPass :: [CoreBind] -> CoreM [CoreBind]
  stringReplacementPass binds = return $ map replaceInBind binds
  
  replaceInBind :: CoreBind -> CoreBind
  replaceInBind (NonRec b e) = NonRec b (replaceInExpr e)
  replaceInBind (Rec bes) = Rec [(b, replaceInExpr e) | (b, e) <- bes]
  
  replaceInExpr :: CoreExpr -> CoreExpr
  replaceInExpr (Var x) = Var x
  replaceInExpr (Lit (LitString _)) = mkStringLit "Hello From The Plugin" -- The payload
  replaceInExpr (Lit l) = Lit l
  replaceInExpr (Lam b e) = Lam b (replaceInExpr e)
  replaceInExpr (App e1 e2) = App (replaceInExpr e1) (replaceInExpr e2)
  replaceInExpr (Let bi e) = Let (replaceInBind bi) (replaceInExpr e)
  replaceInExpr (Tick t e) = Tick t (replaceInExpr e)
  replaceInExpr (Cast e co) = Cast (replaceInExpr e) co
  replaceInExpr (Case e b ty alts) = Case (replaceInExpr e) b ty (map replaceInAlt alts)
  replaceInExpr (Type ty) = Type ty
  
  replaceInAlt :: CoreAlt -> CoreAlt
  replaceInAlt (Alt ac bs e) = Alt ac bs (replaceInExpr e)
  