Skip to content

Commit ae82b72

Browse files
committed
fix(scripts): clean up lint-diskio-complexities
1 parent da5f133 commit ae82b72

File tree

1 file changed

+40
-51
lines changed

1 file changed

+40
-51
lines changed

scripts/lint-diskio-complexities.hs

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ build-depends:
1717
{-# LANGUAGE TypeApplications #-}
1818

1919
import Control.Applicative (Alternative (..))
20+
import Control.Monad (unless)
2021
import qualified Data.ByteString.Lazy as BSL
2122
import Data.Csv
2223
import Data.List (zip4)
@@ -32,6 +33,7 @@ import qualified Data.Text.IO as TIO
3233
import Data.Traversable (for)
3334
import Data.Vector (Vector)
3435
import qualified Data.Vector as V
36+
import System.Exit (ExitCode (..), exitWith)
3537
import System.Process (readProcess)
3638

3739
type Function = Text
@@ -78,91 +80,78 @@ main = do
7880

7981
-- Comparing Database.LSMTree.Simple to Database.LSMTree
8082
putStrLn "Comparing Database.LSMTree.Simple to Database.LSMTree:"
81-
diskIOComplexityComparisonSimpleToFull <-
82-
for (concat . M.elems $ mapForSimpleApi) $ \diskIOComplexity@DiskIOComplexity{..} -> do
83+
comparisonSimpleToFull <-
84+
fmap concat . for (concat . M.elems $ mapForSimpleApi) $ \simpleEntry@DiskIOComplexity{..} -> do
8385
case M.lookup function mapForFullApi of
8486
Nothing ->
85-
pure [("Database.LSMTree.Simple", diskIOComplexity)]
86-
Just fullDiskIOComplexities
87-
| diskIOComplexity `elem` fullDiskIOComplexities -> pure []
88-
| otherwise -> pure (("Database.LSMTree.Simple", diskIOComplexity) : (("Database.LSMTree",) <$> fullDiskIOComplexities))
89-
TIO.putStrLn . prettyDiskIOComplexityTable . concat $ diskIOComplexityComparisonSimpleToFull
87+
pure [("Database.LSMTree.Simple", simpleEntry)]
88+
Just fullEntries
89+
| simpleEntry `elem` fullEntries -> pure []
90+
| otherwise -> pure (("Database.LSMTree.Simple", simpleEntry) : (("Database.LSMTree",) <$> fullEntries))
91+
TIO.putStrLn (prettyDiskIOComplexityTable comparisonSimpleToFull)
9092

9193
-- Comparing lsm-tree.cabal to Database.LSMTree
9294
putStrLn "Comparing lsm-tree.cabal to Database.LSMTree:"
93-
diskIOComplexityComparisonPackageDescriptionToFull <-
94-
for (concat . M.elems $ mapForPackageDescription) $ \diskIOComplexity@DiskIOComplexity{..} -> do
95+
comparisonPackageDescriptionToFull <-
96+
fmap concat . for (concat . M.elems $ mapForPackageDescription) $ \simpleEntry@DiskIOComplexity{..} -> do
9597
case M.lookup function mapForFullApi of
9698
Nothing ->
97-
pure [("lsm-tree.cabal", diskIOComplexity)]
98-
Just fullDiskIOComplexities
99-
| any (looseEq diskIOComplexity) fullDiskIOComplexities -> pure []
100-
| otherwise -> pure (("lsm-tree.cabal", diskIOComplexity) : (("Database.LSMTree",) <$> fullDiskIOComplexities))
101-
TIO.putStrLn . prettyDiskIOComplexityTable . concat $ diskIOComplexityComparisonPackageDescriptionToFull
99+
pure [("lsm-tree.cabal", simpleEntry)]
100+
Just fullEntries
101+
| any (looseEq simpleEntry) fullEntries -> pure []
102+
| otherwise -> pure (("lsm-tree.cabal", simpleEntry) : (("Database.LSMTree",) <$> fullEntries))
103+
TIO.putStrLn (prettyDiskIOComplexityTable comparisonPackageDescriptionToFull)
104+
105+
-- Set the exit code based on whether any differences were found
106+
unless (null comparisonSimpleToFull && null comparisonPackageDescriptionToFull) $
107+
exitWith (ExitFailure 1)
102108

103109
--------------------------------------------------------------------------------
104110
-- Helper functions
105111
--------------------------------------------------------------------------------
106112

107113
-- | Typeset a tagged list of 'DiskIOComplexity' records as an aligned table.
108114
prettyDiskIOComplexityTable :: [(Text, DiskIOComplexity)] -> Text
109-
prettyDiskIOComplexityTable diskIOComplexities =
115+
prettyDiskIOComplexityTable [] = "No differences found.\n"
116+
prettyDiskIOComplexityTable entries =
110117
T.unlines
111118
[ T.unwords
112-
[ tag `padUpTo` maxTagLen
113-
, function `padUpTo` maxFunctionLen
114-
, condition `padUpTo` maxConditionLen
115-
, worstCaseDiskIOComplexity `padUpTo` maxWorstCaseDiskIOComplexityLen
119+
[ prettyCellForColumn tag tags
120+
, prettyCellForColumn function functions
121+
, prettyCellForColumn fullCondition fullConditions
122+
, prettyCellForColumn worstCaseDiskIOComplexity worstCaseDiskIOComplexities
116123
]
117-
| (tag, function, condition, worstCaseDiskIOComplexity) <-
118-
zip4 tags functions conditions worstCaseDiskIOComplexities
124+
| (tag, function, fullCondition, worstCaseDiskIOComplexity) <-
125+
zip4 tags functions fullConditions worstCaseDiskIOComplexities
119126
]
120127
where
121-
tags = fst <$> diskIOComplexities
122-
maxTagLen = maximum (T.length <$> tags)
123-
124-
functions = ((.function) . snd) <$> diskIOComplexities
125-
maxFunctionLen = maximum (T.length <$> functions)
126-
127-
conditions = (prettyCondition . snd) <$> diskIOComplexities
128-
maxConditionLen = maximum (T.length <$> conditions)
128+
tags = fst <$> entries
129+
functions = ((.function) . snd) <$> entries
130+
fullConditions = (prettyFullCondition . snd) <$> entries
131+
worstCaseDiskIOComplexities = ((.worstCaseDiskIOComplexity) . snd) <$> entries
129132

130-
worstCaseDiskIOComplexities = ((.worstCaseDiskIOComplexity) . snd) <$> diskIOComplexities
131-
maxWorstCaseDiskIOComplexityLen = maximum (T.length <$> worstCaseDiskIOComplexities)
133+
prettyCellForColumn :: Text -> [Text] -> Text
134+
prettyCellForColumn cell column = cell <> T.replicate (maximum (T.length <$> column) - T.length cell) " "
132135

133-
padUpTo :: Text -> Int -> Text
134-
padUpTo txt len = txt <> T.replicate (len - T.length txt) " "
135-
136-
prettyCondition :: DiskIOComplexity -> Text
137-
prettyCondition DiskIOComplexity{..} =
138-
fromMaybe "*" (unionMaybeWith slash mergePolicy (unionMaybeWith slash mergeSchedule condition))
136+
prettyFullCondition :: DiskIOComplexity -> Text
137+
prettyFullCondition DiskIOComplexity{..} =
138+
fromMaybe "*" mergePolicy `slashWith` mergeSchedule `slashWith` condition
139139
where
140-
slash :: Text -> Text -> Text
141-
x `slash` y = x <> "/" <> y
142-
143-
unionMaybeWith :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
144-
unionMaybeWith op (Just x) (Just y) = Just (x `op` y)
145-
unionMaybeWith _op (Just x) Nothing = Just x
146-
unionMaybeWith _op Nothing (Just y) = Just y
147-
unionMaybeWith _op Nothing Nothing = Nothing
140+
slashWith :: Text -> Maybe Text -> Text
141+
slashWith x my = maybe x (\y -> x <> "/" <> y) my
148142

149143
-- | Structure vector of 'DiskIOComplexity' records into lookup table by function name.
150144
buildDiskIOComplexityMap :: Vector DiskIOComplexity -> Map Function [DiskIOComplexity]
151145
buildDiskIOComplexityMap = M.unionsWith (<>) . fmap toSingletonMap . V.toList
152146
where
153147
toSingletonMap :: DiskIOComplexity -> Map Function [DiskIOComplexity]
154-
toSingletonMap diskIOComplexity = M.singleton diskIOComplexity.function [diskIOComplexity]
148+
toSingletonMap simpleEntry = M.singleton simpleEntry.function [simpleEntry]
155149

156150
-- | Parse CSV file into vector of 'DiskIOComplexity' records.
157151
decodeDiskIOComplexities :: String -> Vector DiskIOComplexity
158152
decodeDiskIOComplexities =
159153
either error snd . decodeByName . BSL.fromStrict . TE.encodeUtf8 . T.pack
160154

161-
-- | CSV file header for 'DiskIOComplexity' records.
162-
diskIOComplexityHeader :: Header
163-
diskIOComplexityHeader =
164-
header ["Function", "Merge policy", "Merge schedule", "Worst-case disk I/O complexity", "Condition"]
165-
166155
normaliseWorstCaseDiskIOComplexity :: WorstCaseDiskIOComplexity -> WorstCaseDiskIOComplexity
167156
normaliseWorstCaseDiskIOComplexity =
168157
T.replace "+ " "+" . T.replace " +" "+" . T.replace " \\" "\\" . T.replace " " " " . T.replace "\\:" ""

0 commit comments

Comments
 (0)