packages feed

clanki-1.2.5: src/Add.hs

module Add where
import Card
import Display
import Text.Printf(printf)
import qualified Input
data AddAction = NewDeck | ToDeck deriving (Show, Eq)

instance Display AddAction where
    display NewDeck = "New deck"
    display ToDeck  = "Add to deck"

addLoop :: [Card] -> IO [Card]
addLoop decks = do
    addAction <- getAddAction decks
    runAddAction addAction decks

runAddAction :: Maybe AddAction -> [Card] -> IO [Card]
runAddAction (Just NewDeck) cards = do
    printf $ "Press <Enter> at any time to stop adding" ++ "\n"
    newDeck cards
runAddAction (Just ToDeck)  cards = do
    printf $ "Press <Enter> at any time to stop adding" ++ "\n"
    toDeck cards
runAddAction Nothing        cards = return cards

newDeck :: [Card] -> IO [Card]
newDeck cards = do
    deckName <- Input.sameLinePrompt "New deck name : "
    case deckName of 
        "" -> return cards
        _  -> if any (\card -> cardDeck card == deckName) cards
                then do
                    printf $ "Invalid input, already a deck with that name" ++ "\n"
                    newDeck cards
                else 
                    toDeckLoop deckName cards

toDeck :: [Card] -> IO [Card]
toDeck cards = do
    chosenDeckName <- Input.getUserChoiceStr $ allDeckNames cards
    case chosenDeckName of
        Just deckName -> do
                        newCards <- toDeckLoop deckName cards
                        return newCards
        Nothing -> return cards


toDeckLoop :: String -> [Card] -> IO [Card]
toDeckLoop deckName cards = do
    question <- Input.sameLinePrompt "Add question : "
    case question of 
        "" -> do
                {-printf $ "You wish to stop adding" ++ "\n"-}
                printf "\n"
                return cards
        _  -> do
            answer <- Input.sameLinePrompt "Add answer   : "
            case answer of
                "" -> do
                    return cards
                _  -> do
                    let card = newCard question answer deckName
                    toDeckLoop deckName (card:cards)

getAddAction :: [Card] -> IO (Maybe AddAction)
getAddAction [] = return $ Just NewDeck
getAddAction _  = Input.getUserChoice allAddActions

allAddActions :: [AddAction]
allAddActions = [NewDeck, ToDeck]