{-# LANGUAGE OverloadedStrings #-}
module VabalContext where
import Distribution.Version
import Distribution.Parsec.Class
import Data.Csv
import Data.List (find, sortOn)
import Data.Maybe (isJust)
import Data.Ord (Down(..))
import Data.Foldable (toList)
import qualified Data.ByteString.Lazy as B
data GhcMetadata = GhcMetadata
{ ghcVersion :: Version
, baseVersion :: Version
}
instance Eq GhcMetadata where
(GhcMetadata g _) == (GhcMetadata g' _) = g == g'
instance Ord GhcMetadata where
compare (GhcMetadata g _) (GhcMetadata g' _) = compare g g'
instance FromNamedRecord GhcMetadata where
parseNamedRecord r = do
field1 <- r .: "ghcVersion"
ghcVer <- maybe (fail "Expected version") return $ simpleParsec field1
field2 <- r .: "baseVersion"
baseVer <- maybe (fail "Expected version") return $ simpleParsec field2
return $ GhcMetadata ghcVer baseVer
newtype GhcToBaseMap = GhcToBaseMap { unwrapMap :: [GhcMetadata] }
emptyMap :: GhcToBaseMap
emptyMap = GhcToBaseMap []
readGhcToBaseMap :: B.ByteString -> Either String GhcToBaseMap
readGhcToBaseMap contents = do
(_, entries) <- decodeByName contents
return . GhcToBaseMap . sortOn Down $ toList entries
subMap :: GhcToBaseMap -> [Version] -> GhcToBaseMap
subMap (GhcToBaseMap m) versions = GhcToBaseMap $
filter (\e -> ghcVersion e `elem` versions) m
hasGhcVersion :: GhcToBaseMap -> Version -> Bool
hasGhcVersion (GhcToBaseMap m) v = isJust $
find (\e -> ghcVersion e == v) m
data VabalContext = VabalContext
{ availableGhcs :: GhcToBaseMap
, allGhcInfo :: GhcToBaseMap
, alwaysNewestGhc :: Bool
}