clanki-1.2.6: src/Card.hs
module Card where
import Display
import Text.Printf(printf)
import Data.List(nub, intercalate)
import StatTracker
data CardTracker = CardTracker {ctEF :: Float, ctN :: Int, ctTimeQuizzed :: Int, ctLastResponseQuality :: Maybe Int} deriving (Show, Read, Eq)
data Card = Card {cardQuestion :: String, cardAnswer :: String, cardDeck :: String, cardTracker :: CardTracker, cardStatTracker :: StatTracker} deriving (Show, Read, Eq)
newCard :: String -> String -> String -> Card
newCard question answer deckName = Card {cardQuestion = question, cardAnswer = answer, cardDeck = deckName, cardTracker = newCardTracker, cardStatTracker = newStatTracker}
newCardTracker :: CardTracker
newCardTracker = CardTracker {ctEF = 2.5, ctN = 0, ctTimeQuizzed = 0, ctLastResponseQuality = Nothing}
instance Display Card where
display card = "Q : " ++ cardQuestion card ++ "\n" ++ "A : " ++ cardAnswer card
printCard :: Card -> IO ()
printCard card = printf $ "Q : " ++ cardQuestion card ++ "\n" ++ "A : " ++ cardAnswer card
allDeckNames :: [Card] -> [String]
allDeckNames cards = nub . map cardDeck $ cards
cardsInDeck :: String -> [Card] -> [Card]
cardsInDeck deckName = filter ((== deckName) . cardDeck)
replaceCardsInDeck :: String -> [Card] -> [Card] -> [Card]
replaceCardsInDeck deckName newCards allCards = do
let cardsOldDeckRemoved = filter (\card -> cardDeck card /= deckName) allCards
cardsOldDeckRemoved ++ newCards
displayCardsInDeck :: String -> [Card] -> String
displayCardsInDeck deckName cards =
prependDeckName . appendNewLine . displayListCards $ deckCards
where
prependDeckName = (deckName ++) . ("\n" ++)
appendNewLine = (++ "\n")
deckCards = filter (\card -> cardDeck card == deckName) cards
displayListCards :: [Card] -> String
displayListCards cards = intercalate "\n" . map display $ cards
displayAllDecks :: [Card] -> IO ()
displayAllDecks cards = do
let deckNames = allDeckNames cards
let cardsDisplayed = intercalate "\n" $ map (\dName -> displayCardsInDeck dName cards) deckNames
printf $ cardsDisplayed ++ "\n"
hasDeckNamed :: String -> [Card] -> Bool
hasDeckNamed deckName cards = not . null $ filter (\card -> cardDeck card == deckName) cards