{-# LANGUAGE TupleSections #-}
{-# LANGUAGE ViewPatterns #-}
module Aura.Commands.B
( saveState
, restoreState
, cleanStates
, listStates
) where
import Aura.Core (warn)
import Aura.IO
import Aura.Languages
import Aura.Settings
import Aura.State
import RIO
import RIO.Directory
import RIO.FilePath
import qualified RIO.List as L
import qualified RIO.NonEmpty as NEL
import qualified RIO.Text as T
cleanStates :: Settings -> Word -> IO ()
cleanStates ss (fromIntegral -> n) = do
stfs <- reverse <$> getStateFiles
(pinned, others) <- L.partition p <$> traverse (\sf -> (sf,) <$> readState sf) stfs
warn ss $ cleanStates_4 (length stfs)
unless (null pinned) . warn ss $ cleanStates_6 (length pinned)
forM_ (NEL.nonEmpty stfs) $ \stfs' -> do
let mostRecent = T.pack . takeFileName $ NEL.head stfs'
warn ss $ cleanStates_5 mostRecent
okay <- optionalPrompt ss $ cleanStates_2 n
if not okay
then warn ss cleanStates_3
else traverse_ (removeFile . fst) . drop n $ others
where
p :: (a, Maybe PkgState) -> Bool
p = maybe False pinnedOf . snd
listStates :: IO ()
listStates = getStateFiles >>= traverse_ (putTextLn . T.pack)