Skip to content

Commit 3d9e50d

Browse files
authored
Add --sort switch to 'available' command (#13)
1 parent 86ec3eb commit 3d9e50d

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

app/Main.hs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import qualified Control.Foldl as Foldl
1111
import qualified Data.Aeson as Aeson
1212
import Data.Aeson.Encode.Pretty
1313
import Data.Foldable (fold, for_, traverse_)
14+
import qualified Data.Graph as G
1415
import Data.List (maximumBy, nub)
1516
import qualified Data.Map as Map
1617
import Data.Maybe (fromMaybe, mapMaybe)
@@ -246,14 +247,24 @@ listDependencies = do
246247
trans <- getTransitiveDeps db depends
247248
traverse_ (echoT . fst) trans
248249

249-
listPackages :: IO ()
250-
listPackages = do
250+
listPackages :: Bool -> IO ()
251+
listPackages sorted = do
251252
pkg <- readPackageFile
252253
db <- readPackageSet pkg
253-
traverse_ echoT (fmt <$> Map.assocs db)
254+
if sorted
255+
then traverse_ echoT (fmt <$> inOrder (Map.assocs db))
256+
else traverse_ echoT (fmt <$> Map.assocs db)
254257
where
255258
fmt :: (Text, PackageInfo) -> Text
256-
fmt (name, PackageInfo{ version }) = name <> " (" <> version <> ")"
259+
fmt (name, PackageInfo{ version, repo }) = name <> " (" <> version <> ", " <> repo <> ")"
260+
261+
inOrder xs = fromNode . fromVertex <$> vs where
262+
(gr, fromVertex) =
263+
G.graphFromEdges' [ (pkg, name, dependencies pkg)
264+
| (name, pkg) <- xs
265+
]
266+
vs = G.topSort (G.transposeG gr)
267+
fromNode (pkg, name, _) = (name, pkg)
257268

258269
getSourcePaths :: PackageConfig -> PackageSet -> [Text] -> IO [Turtle.FilePath]
259270
getSourcePaths PackageConfig{..} db pkgNames = do
@@ -432,7 +443,7 @@ main = do
432443
(Opts.info (pure listSourcePaths)
433444
(Opts.progDesc "List all (active) source paths for dependencies"))
434445
, Opts.command "available"
435-
(Opts.info (pure listPackages)
446+
(Opts.info (listPackages <$> sorted)
436447
(Opts.progDesc "List all packages available in the package set"))
437448
, Opts.command "updates"
438449
(Opts.info (checkForUpdates <$> apply <*> applyMajor Opts.<**> Opts.helper)
@@ -458,3 +469,8 @@ main = do
458469
Opts.long "only-dependencies"
459470
<> Opts.short 'd'
460471
<> Opts.help help
472+
473+
sorted = Opts.switch $
474+
Opts.long "sort"
475+
<> Opts.short 's'
476+
<> Opts.help "Sort packages in dependency order"

0 commit comments

Comments
 (0)