97 lines
2.4 KiB
Haskell
97 lines
2.4 KiB
Haskell
module Cards.Card
|
|
( Tier -- Tier stuff
|
|
, tierDiff
|
|
, tierName
|
|
, Card -- Card stuff
|
|
, sides
|
|
, tier
|
|
, lastChecked
|
|
, offset
|
|
, isDue
|
|
, reset
|
|
, update
|
|
, createCard
|
|
) where
|
|
|
|
import Data.Time
|
|
|
|
data Card = Card
|
|
{ sides :: [String]
|
|
, tier :: Tier
|
|
, lastChecked :: UTCTime
|
|
, offset :: NominalDiffTime
|
|
} deriving (Show)
|
|
|
|
data Tier = Unrevised
|
|
| TenMin | TwentyMin | FortyMin
|
|
| OneDay | TwoDays | FourDays | EightDays
|
|
| SixteenDays | ThirtyTwoDays | SixtyFourDays
|
|
deriving (Show, Eq, Ord, Enum, Bounded)
|
|
|
|
{-
|
|
- Tier stuff
|
|
-}
|
|
|
|
tierDiff :: Tier -> NominalDiffTime
|
|
tierDiff Unrevised = 0
|
|
tierDiff TenMin = 60 * 10
|
|
tierDiff TwentyMin = 60 * 20
|
|
tierDiff FortyMin = 60 * 40
|
|
tierDiff OneDay = 3600 * ( 1 * 24 - 8)
|
|
tierDiff TwoDays = 3600 * ( 2 * 24 - 8)
|
|
tierDiff FourDays = 3600 * ( 4 * 24 - 8)
|
|
tierDiff EightDays = 3600 * ( 8 * 24 - 8)
|
|
tierDiff SixteenDays = 3600 * (16 * 24 - 8)
|
|
tierDiff ThirtyTwoDays = 3600 * (32 * 24 - 8)
|
|
tierDiff SixtyFourDays = 3600 * (64 * 24 - 8)
|
|
|
|
tierName :: Tier -> String
|
|
tierName Unrevised = "unrevised"
|
|
tierName TenMin = "10min"
|
|
tierName TwentyMin = "20min"
|
|
tierName FortyMin = "40min"
|
|
tierName OneDay = "1d"
|
|
tierName TwoDays = "2d"
|
|
tierName FourDays = "4d"
|
|
tierName EightDays = "8d"
|
|
tierName SixteenDays = "16d"
|
|
tierName ThirtyTwoDays = "32d"
|
|
tierName SixtyFourDays = "64d"
|
|
|
|
{-
|
|
- Card stuff
|
|
-}
|
|
|
|
isDue :: UTCTime -> Card -> Bool
|
|
isDue time Card{tier=t, lastChecked=lc, offset=o} =
|
|
diffUTCTime time lc >= o + tierDiff t
|
|
|
|
-- These functions use the IO monad for generating random offsets.
|
|
-- TODO: actually implement random offset
|
|
updateOffset :: Card -> IO Card
|
|
updateOffset Card{sides=s, tier=t, lastChecked=lc} = do
|
|
return Card{sides=s, tier=t, lastChecked=lc, offset=0}
|
|
|
|
reset :: UTCTime -> Card -> Card
|
|
reset time Card{sides=s} =
|
|
Card{sides=s, tier=minBound, lastChecked=time, offset=0}
|
|
|
|
update :: UTCTime -> Card -> IO Card
|
|
update time Card{sides=s, tier=t} =
|
|
updateOffset $ Card {sides=s, tier=boundedSucc t, lastChecked=time, offset=0}
|
|
|
|
-- helper function
|
|
boundedSucc :: (Eq a, Bounded a, Enum a) => a -> a
|
|
boundedSucc a
|
|
| a == maxBound = a
|
|
| otherwise = succ a
|
|
|
|
createCard :: UTCTime -> [String] -> Card
|
|
createCard time s =
|
|
Card{sides=s, tier=minBound, lastChecked=time, offset=0}
|
|
|
|
{-
|
|
- Parsing Cards
|
|
-}
|
|
|
|
-- TODO
|