{-# LANGUAGE NoImplicitPrelude  #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
module Stackage.Curator.RevDeps
    ( listRevDeps
    ) where

import Stackage.Prelude
import Data.Yaml (decodeFileEither)
import Control.Monad.State.Strict (execState, get, put)

listRevDeps :: FilePath
            -> Bool -- ^ deep revdeps
            -> PackageName -- ^ package to check
            -> IO ()
listRevDeps planFile _FIXMEdeep pkg0 = do
    BuildPlan {..} <- decodeFileEither planFile >>= either throwIO return
    let go pkg = do
          visited <- get
          unless (pkg `member` visited) $ do
            put $ insertSet pkg visited
            case lookup pkg bpPackages of
              Nothing -> return ()
              Just PackagePlan {..} -> mapM_ go ppUsers
    let pkgs = execState (go pkg0) (asSet mempty)
    mapM_ (putStrLn . pack . unPackageName) pkgs