@@ -17,6 +17,7 @@ build-depends:
1717{-# LANGUAGE TypeApplications #-}
1818
1919import Control.Applicative (Alternative (.. ))
20+ import Control.Monad (unless )
2021import qualified Data.ByteString.Lazy as BSL
2122import Data.Csv
2223import Data.List (zip4 )
@@ -32,6 +33,7 @@ import qualified Data.Text.IO as TIO
3233import Data.Traversable (for )
3334import Data.Vector (Vector )
3435import qualified Data.Vector as V
36+ import System.Exit (ExitCode (.. ), exitWith )
3537import System.Process (readProcess )
3638
3739type 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.
108114prettyDiskIOComplexityTable :: [(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.
150144buildDiskIOComplexityMap :: Vector DiskIOComplexity -> Map Function [DiskIOComplexity ]
151145buildDiskIOComplexityMap = 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.
157151decodeDiskIOComplexities :: String -> Vector DiskIOComplexity
158152decodeDiskIOComplexities =
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-
166155normaliseWorstCaseDiskIOComplexity :: WorstCaseDiskIOComplexity -> WorstCaseDiskIOComplexity
167156normaliseWorstCaseDiskIOComplexity =
168157 T. replace " + " " +" . T. replace " +" " +" . T. replace " \\ " " \\ " . T. replace " " " " . T. replace " \\ :" " "
0 commit comments