Randomize learn order and offsets

This commit is contained in:
Joscha 2018-01-05 17:04:08 +00:00
parent e10e1b930a
commit 8d882cf861
3 changed files with 18 additions and 8 deletions

View file

@ -10,6 +10,7 @@ import Data.Char
import Data.Time import Data.Time
import System.Console.Haskeline import System.Console.Haskeline
import System.Console.Haskeline.History import System.Console.Haskeline.History
import System.Random.Shuffle
type Input = InputT IO type Input = InputT IO
@ -75,9 +76,8 @@ trim c = dropWhile (== c) . reverse . dropWhile (== c) . reverse
askElements :: UTCTime -> Elements -> Input Elements askElements :: UTCTime -> Elements -> Input Elements
askElements time elms = do askElements time elms = do
let l = toDueCards time elms cards <- lift $ shuffleM $ toDueCards time elms
-- TODO: Randomize order newCards <- askCountdown time cards
newCards <- askCountdown time l
return $ updateElements elms (fromCards newCards) return $ updateElements elms (fromCards newCards)
askCountdown :: UTCTime -> [(Integer, Card)] -> Input [(Integer, Card)] askCountdown :: UTCTime -> [(Integer, Card)] -> Input [(Integer, Card)]

View file

@ -26,6 +26,8 @@ dependencies:
- transformers - transformers
- haskeline - haskeline
- megaparsec - megaparsec
- random
- random-shuffle
library: library:
source-dirs: src source-dirs: src

View file

@ -1,3 +1,4 @@
-- | Index-card-like system.
module Cards module Cards
( Elements -- Elements stuff ( Elements -- Elements stuff
, updateElements , updateElements
@ -30,6 +31,7 @@ import qualified Data.Map.Strict as Map
import Data.Time import Data.Time
import Data.Time.Clock.POSIX import Data.Time.Clock.POSIX
import Data.Void import Data.Void
import System.Random
import Text.Megaparsec import Text.Megaparsec
import Text.Megaparsec.Char import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L import qualified Text.Megaparsec.Char.Lexer as L
@ -143,11 +145,11 @@ isDue time Card{tier=t, lastChecked=lc, offset=o} =
diffUTCTime time lc >= o + tierDiff t diffUTCTime time lc >= o + tierDiff t
-- These functions use the IO monad for generating random offsets. -- These functions use the IO monad for generating random offsets.
--
-- TODO: actually implement random offset
updateOffset :: Card -> IO Card updateOffset :: Card -> IO Card
updateOffset Card{sides=s, tier=t, lastChecked=lc} = do updateOffset Card{sides=s, tier=t, lastChecked=lc} = do
return Card{sides=s, tier=t, lastChecked=lc, offset=0} let maxOffset = tierDiff t / 4
o <- integerToNom <$> randomRIO (0, nomToInteger maxOffset)
return Card{sides=s, tier=t, lastChecked=lc, offset=o}
-- | Reset a card's 'Tier'. -- | Reset a card's 'Tier'.
-- --
@ -210,6 +212,12 @@ tierName SixtyFourDays = "64d"
- Converting to String - Converting to String
-} -}
integerToNom :: Integer -> NominalDiffTime
integerToNom = fromInteger
nomToInteger :: NominalDiffTime -> Integer
nomToInteger = (truncate :: Double -> Integer) . realToFrac
-- | Convert an 'Elements' to a string which can be parsed by 'parseElements'. -- | Convert an 'Elements' to a string which can be parsed by 'parseElements'.
-- --
-- This string can then be written to a text file for storage. -- This string can then be written to a text file for storage.
@ -226,7 +234,7 @@ cardToString :: Card -> String
cardToString Card{sides=s, tier=t, lastChecked=lc, offset=o} = cardToString Card{sides=s, tier=t, lastChecked=lc, offset=o} =
let info = ":: {\"level\": " ++ (show $ fromEnum t) ++ let info = ":: {\"level\": " ++ (show $ fromEnum t) ++
", \"last_checked\": " ++ formatTime defaultTimeLocale "%s" lc ++ ", \"last_checked\": " ++ formatTime defaultTimeLocale "%s" lc ++
", \"delay\": " ++ (show $ fromEnum o) ++ ", \"delay\": " ++ (show $ nomToInteger o) ++
"}" "}"
in unlines $ info : intersperse "::" s in unlines $ info : intersperse "::" s
@ -295,7 +303,7 @@ lastCheckedInfo = do
offsetInfo :: Parser (Card -> Card) offsetInfo :: Parser (Card -> Card)
offsetInfo = do offsetInfo = do
number <- field "delay" number <- field "delay"
let o = fromInteger number let o = integerToNom number
return (\card -> card {offset=o}) return (\card -> card {offset=o})
-- sides of a card -- sides of a card