2{-# LANGUAGE LambdaCase #-}
3{-# LANGUAGE OverloadedStrings #-}
8-- This module provides a GHC plugin designed to improve code that uses
9-- Reflex. Currently, it just adds an INLINABLE pragma to any top-level
10-- definition that doesn't have an explicit inlining pragma. In the future,
11-- additional optimizations are likely to be added.
12module Reflex.Optimizer
24#if MIN_VERSION_base(4,9,0)
25import Prelude hiding ((<>))
32-- | The GHCJS build of Reflex.Optimizer just throws an error; instead, the version built with GHC should be used.
34plugin = error "The GHCJS build of Reflex.Optimizer cannot be used. Instead, build with GHC and use the result with GHCJS."
38-- | The GHC plugin itself. See "GhcPlugins" for more details.
40plugin = defaultPlugin { installCoreToDos = install }
42install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
44 liftIO $ putStrLn $ showSDocUnsafe $ ppr p
46 simpl@(CoreDoSimplify _ _) -> [CoreDoSpecialising, simpl]
48 return $ makeInlinable : concatMap f p
49install options@(_:_) p = do
50 warnMsg $ "Reflex.Optimizer: ignoring " <> fromString (show $ length options) <> " command-line options"
53makeInlinable :: CoreToDo
54makeInlinable = CoreDoPluginPass "MakeInlinable" $ \modGuts -> do
55 let f v = setIdInfo v $ let i = idInfo v in
56 setInlinePragInfo i $ let p = inlinePragInfo i in
57 if isDefaultInlinePragma p
58 then defaultInlinePragma { inl_inline = Inlinable }
60 newBinds = flip map (mg_binds modGuts) $ \case
61 NonRec b e -> NonRec (f b) e
62 Rec bes -> Rec $ map (first f) bes
63 return $ modGuts { mg_binds = newBinds }
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list