packages feed

clanki-1.0.3: src/Remove.hs

module Remove where
import Decks
import Display
import Text.Printf(printf)
import qualified Input
data RemoveAction = RemoveDeck | RemoveFromDeck deriving (Show, Eq)

instance Display RemoveAction where
    display removeAct
        | removeAct == RemoveDeck = "Remove a deck"
        | removeAct == RemoveFromDeck = "Remove cards from a deck"

removeLoop :: [Deck] -> IO [Deck]
removeLoop decks = do
    removeAction <- getRemoveAction decks
    updatedDecks <- runRemoveAction removeAction decks
    return $ updatedDecks

runRemoveAction :: Maybe RemoveAction -> [Deck] -> IO [Deck]
runRemoveAction removeAction decks
    | removeAction == Just RemoveDeck     = removeDeck decks
    | removeAction == Just RemoveFromDeck = removeFromDeck decks
    | removeAction == Nothing             = return decks

removeDeck :: [Deck] -> IO [Deck]
removeDeck decks = do
    printf $ "Choose what deck to remove" ++ "\n"
    input <- Input.getUserChoice decks
    case input of 
        Just deck -> return $ filter (/= deck) decks
        Nothing   -> return decks


removeFromDeck :: [Deck] -> IO [Deck]
removeFromDeck decks = do
    chosenDeck <- Input.getUserChoice $ filter (\deck -> length (dCards deck) > 0) decks
    case chosenDeck of
        Just deck -> do
                        updatedDeck <- removeFromDeckLoop deck
                        let newDecks = replaceDeckNamed (dName updatedDeck) updatedDeck decks 
                        return newDecks 
        Nothing -> return decks

removeFromDeckLoop :: Deck -> IO Deck
removeFromDeckLoop deck = do
    input <- Input.getUserChoice $ dCards deck
    case input of 
        Just card  -> if length (dCards deck) > 0 
                        then removeFromDeckLoop $ removeCardFromDeck card deck
                        else return deck
        Nothing    -> return deck

getRemoveAction :: [Deck] -> IO (Maybe RemoveAction)
getRemoveAction decks
    | null decks = return Nothing
    | all (\deck -> length (dCards deck) == 0) decks = return $ Just RemoveDeck
    | otherwise  = Input.getUserChoice allRemoveActions

allRemoveActions :: [RemoveAction]
allRemoveActions = [RemoveDeck, RemoveFromDeck]