mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-08-15 16:44:33 +02:00
59 lines
1.6 KiB
Haskell
59 lines
1.6 KiB
Haskell
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# OPTIONS -Wno-name-shadowing #-}
|
|
module Main (main) where
|
|
|
|
import Control.Monad
|
|
import Control.Monad.IO.Class (MonadIO (..))
|
|
import Control.Monad.State (MonadState (..), runStateT)
|
|
import Data.Text (Text)
|
|
import RIO.Map (Map)
|
|
import System.IO (openFile, IOMode (..), hFlush, hClose)
|
|
import qualified Data.Text as T
|
|
import qualified Data.Text.IO as T
|
|
|
|
import BuildConstraints (parsePackageDecl, handlePackage)
|
|
import Snapshot (snapshotMap, loadSnapshot)
|
|
import Types (PackageName, Version)
|
|
|
|
src :: String
|
|
src = "../../build-constraints.yaml"
|
|
|
|
target :: String
|
|
target = "../../lts-build-constraints.yaml"
|
|
|
|
data State
|
|
= LookingForLibBounds
|
|
| ProcessingLibBounds
|
|
| Done
|
|
|
|
main :: IO ()
|
|
main = do
|
|
map <- snapshotMap <$> loadSnapshot "../../../stackage-snapshots/nightly/2023/12/15.yaml"
|
|
output <- openFile target WriteMode
|
|
let putLine = liftIO . T.hPutStrLn output
|
|
lines <- T.lines <$> T.readFile src
|
|
void $ flip runStateT LookingForLibBounds $ do
|
|
forM_ lines $ putLine <=< processLine map
|
|
hFlush output
|
|
hClose output
|
|
|
|
processLine :: MonadState State m => Map PackageName Version -> Text -> m Text
|
|
processLine map line = do
|
|
st <- get
|
|
case st of
|
|
LookingForLibBounds -> do
|
|
when (line == "packages:") $
|
|
put ProcessingLibBounds
|
|
pure line
|
|
ProcessingLibBounds ->
|
|
if line == "# end of packages"
|
|
then do
|
|
put Done
|
|
pure line
|
|
else
|
|
case parsePackageDecl line of
|
|
Just p -> pure $ handlePackage map p
|
|
Nothing -> pure line
|
|
Done -> pure line
|