1
1
{-# LANGUAGE CPP #-}
2
+ {-# LANGUAGE DeriveFunctor #-}
2
3
{-# LANGUAGE RecordWildCards #-}
3
4
{-# LANGUAGE ViewPatterns #-}
4
5
5
6
{- HLINT ignore "Redundant bracket" -} -- a result of CPP expansion
6
7
7
- module Development.IDE.Graph.Internal.Profile (writeProfile ) where
8
+ module Development.IDE.Graph.Internal.Profile (writeProfile , getProfile , getLastBuildKeys ) where
8
9
9
10
import Data.Bifunctor
10
11
import qualified Data.ByteString.Lazy.Char8 as LBS
@@ -41,17 +42,28 @@ import Data.FileEmbed
41
42
import Language.Haskell.TH.Syntax (runIO )
42
43
#endif
43
44
44
- -- | Generates an report given some build system profiling data.
45
- writeProfile :: FilePath -> Database -> IO ()
46
- writeProfile out db = do
45
+ getLastBuildKeys :: Database -> IO [Key ]
46
+ getLastBuildKeys db = do
47
+ (rpt, _) <- getProfile db
48
+ return [ prfName p | p <- rpt, prfBuilt p == 0 ]
49
+
50
+ getProfile :: Database -> IO ([ProfileEntry Key ], Maybe [Int ])
51
+ getProfile db = do
47
52
dirtyKeys <- readIORef (databaseDirtySet db)
48
53
(report, mapping) <- toReport db
49
54
let dirtyKeysMapped = mapMaybe (`IntMap.lookup` mapping) . Set. toList <$> dirtyKeys
50
- rpt <- generateHTML (sort <$> dirtyKeysMapped) report
55
+ return (report, dirtyKeysMapped)
56
+
57
+ -- | Generates an report given some build system profiling data.
58
+ writeProfile :: FilePath -> Database -> IO ()
59
+ writeProfile out db = do
60
+ (report, dirtyKeysMapped) <- getProfile db
61
+ rpt <- generateHTML (sort <$> dirtyKeysMapped) ((fmap . fmap ) show report)
51
62
LBS. writeFile out rpt
52
63
53
- data ProfileEntry = ProfileEntry
54
- { prfName :: ! String , prfBuilt :: ! Int , prfChanged :: ! Int , prfVisited :: ! Int , prfDepends :: [[Int ]], prfExecution :: ! Seconds }
64
+ data ProfileEntry a = ProfileEntry
65
+ { prfName :: ! a , prfBuilt :: ! Int , prfChanged :: ! Int , prfVisited :: ! Int , prfDepends :: [[Int ]], prfExecution :: ! Seconds }
66
+ deriving Functor
55
67
56
68
-- | Eliminate all errors from the database, pretending they don't exist
57
69
-- resultsOnly :: Map.HashMap Id (Key, Status) -> Map.HashMap Id (Key, Result (Either BS.ByteString Value))
@@ -104,7 +116,7 @@ prepareForDependencyOrder db = do
104
116
<$> Ids. toList (databaseValues db)
105
117
106
118
-- | Returns a list of profile entries, and a mapping linking a non-error Id to its profile entry
107
- toReport :: Database -> IO ([ProfileEntry ], IntMap Int )
119
+ toReport :: Database -> IO ([ProfileEntry Key ], IntMap Int )
108
120
toReport db = do
109
121
status <- prepareForDependencyOrder db
110
122
let order = let shw i = maybe " <unknown>" (show . fst ) $ Map. lookup i status
@@ -118,7 +130,7 @@ toReport db = do
118
130
in Map. fromList $ zip (sortBy (flip compare ) xs) [0 .. ]
119
131
120
132
f (k, Result {.. }) = ProfileEntry
121
- {prfName = show k
133
+ {prfName = k
122
134
,prfBuilt = fromStep resultBuilt
123
135
,prfVisited = fromStep resultVisited
124
136
,prfChanged = fromStep resultChanged
@@ -134,7 +146,7 @@ alwaysRerunResult current = Result (Value $ toDyn "<alwaysRerun>") (Step 0) (Ste
134
146
readDataFileHTML :: FilePath -> IO LBS. ByteString
135
147
readDataFileHTML file = LBS. readFile =<< getDataFile (" html" </> file)
136
148
137
- generateHTML :: Maybe [Int ] -> [ProfileEntry ] -> IO LBS. ByteString
149
+ generateHTML :: Maybe [Int ] -> [ProfileEntry String ] -> IO LBS. ByteString
138
150
generateHTML dirtyKeys xs = do
139
151
report <- readDataFileHTML " profile.html"
140
152
let f " data/profile-data.js" = pure $ LBS. pack $ " var profile =\n " ++ generateJSONProfile xs
@@ -146,7 +158,7 @@ generateJSONBuild :: Maybe [Ids.Id] -> String
146
158
generateJSONBuild (Just dirtyKeys) = jsonList [jsonList (map show dirtyKeys)]
147
159
generateJSONBuild Nothing = jsonList []
148
160
149
- generateJSONProfile :: [ProfileEntry ] -> String
161
+ generateJSONProfile :: [ProfileEntry String ] -> String
150
162
generateJSONProfile = jsonListLines . map showEntry
151
163
where
152
164
showEntry ProfileEntry {.. } = jsonList $
0 commit comments