1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
{-# LANGUAGE DeriveGeneric, StandaloneDeriving, BangPatterns, CPP #-}
module GenericsBenchCache (readPackageDescriptionCache) where
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as LC8
import qualified Codec.Compression.GZip as GZip
import Cabal24 (PackageDescription)
import System.Directory
import System.Exit
import GenericsBenchTypes ()
#if ! MIN_VERSION_base(4,8,0)
import Control.Applicative ((<$>))
#endif
readPackageDescriptionCache :: Int -> IO [PackageDescription]
readPackageDescriptionCache amount = do
cacheExists <- doesFileExist cacheFilePath
bs <-
if cacheExists
then do
putStrLn "reading the cache file, might take a moment..."
L.readFile cacheFilePath
else do
-- In older versions of this benchmark, there was machinery to
-- regenerate the cache using the data in @~/.cabal@. Now the cache is
-- simply stored in the repo to avoid a dependency on Cabal the library.
putStrLn (cacheFilePath ++ " missing, aborting")
exitFailure
let str = LC8.unpack (GZip.decompress bs)
pds = take amount (read str)
-- PackageDescription doesn't implement NFData, let's force with the following line
(length (show pds)) `seq` putStrLn "done reading the cache file"
return pds
cacheFilePath :: String
cacheFilePath = "generics-bench.cache-100.gz"
|