1module Stackage.HaskellPlatform
5import Control.Monad (guard)
6import Data.Char (isSpace)
7import Data.List (foldl', isInfixOf, isPrefixOf, stripPrefix)
8import Data.Maybe (mapMaybe)
9import Data.Monoid (Monoid (..))
10import Data.Set (singleton)
11import Distribution.Text (simpleParse)
13import System.Directory (doesFileExist)
14import System.FilePath ((</>))
16loadHaskellPlatform :: SelectSettings -> IO (Maybe HaskellPlatform)
17loadHaskellPlatform ss = do
20 then fmap (Just . parseHP) $ readFile fp
23 GhcMajorVersion x y = selectGhcVersion ss
25 fp = haskellPlatformDir ss </> (concat
33data HPLine = HPLPackage PackageIdentifier
40toHPLine :: String -> Maybe HPLine
42 | "begin core packages" `isInfixOf` s = Just HPLBeginCore
43 | "end core packages" `isInfixOf` s = Just HPLEndCore
44 | "begin platform packages" `isInfixOf` s = Just HPLBeginPlatform
45 | "end platform packages" `isInfixOf` s = Just HPLEndPlatform
47 let s1 = dropWhile isSpace s
48 guard $ not $ "--" `isPrefixOf` s1
50 guard $ "==" `isInfixOf` s1
51 let (package', s2) = break (== '=') s1
52 package = takeWhile (not . isSpace) package'
53 s3 <- stripPrefix "==" s2
54 version <- simpleParse $ takeWhile (/= ',') s3
55 Just $ HPLPackage $ PackageIdentifier (PackageName package) version
57parseHP :: String -> HaskellPlatform
59 snd . foldl' addLine (notInBlock, mempty) . mapMaybe toHPLine . lines
62 inCore x = HaskellPlatform (singleton x) mempty
63 inPlatform x = HaskellPlatform mempty (singleton x)
65 addLine (fromPackage, hp) (HPLPackage vp) = (fromPackage, fromPackage vp `mappend` hp)
66 addLine (_, hp) HPLBeginCore = (inCore, hp)
67 addLine (_, hp) HPLEndCore = (notInBlock, hp)
68 addLine (_, hp) HPLBeginPlatform = (inPlatform, hp)
69 addLine (_, hp) HPLEndPlatform = (notInBlock, hp)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list