Randomize learn order and offsets
This commit is contained in:
parent
e10e1b930a
commit
8d882cf861
3 changed files with 18 additions and 8 deletions
|
|
@ -10,6 +10,7 @@ import Data.Char
|
|||
import Data.Time
|
||||
import System.Console.Haskeline
|
||||
import System.Console.Haskeline.History
|
||||
import System.Random.Shuffle
|
||||
|
||||
type Input = InputT IO
|
||||
|
||||
|
|
@ -75,9 +76,8 @@ trim c = dropWhile (== c) . reverse . dropWhile (== c) . reverse
|
|||
|
||||
askElements :: UTCTime -> Elements -> Input Elements
|
||||
askElements time elms = do
|
||||
let l = toDueCards time elms
|
||||
-- TODO: Randomize order
|
||||
newCards <- askCountdown time l
|
||||
cards <- lift $ shuffleM $ toDueCards time elms
|
||||
newCards <- askCountdown time cards
|
||||
return $ updateElements elms (fromCards newCards)
|
||||
|
||||
askCountdown :: UTCTime -> [(Integer, Card)] -> Input [(Integer, Card)]
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ dependencies:
|
|||
- transformers
|
||||
- haskeline
|
||||
- megaparsec
|
||||
- random
|
||||
- random-shuffle
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
|
|
|||
18
src/Cards.hs
18
src/Cards.hs
|
|
@ -1,3 +1,4 @@
|
|||
-- | Index-card-like system.
|
||||
module Cards
|
||||
( Elements -- Elements stuff
|
||||
, updateElements
|
||||
|
|
@ -30,6 +31,7 @@ import qualified Data.Map.Strict as Map
|
|||
import Data.Time
|
||||
import Data.Time.Clock.POSIX
|
||||
import Data.Void
|
||||
import System.Random
|
||||
import Text.Megaparsec
|
||||
import Text.Megaparsec.Char
|
||||
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
|
||||
|
||||
-- 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}
|
||||
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'.
|
||||
--
|
||||
|
|
@ -210,6 +212,12 @@ tierName SixtyFourDays = "64d"
|
|||
- 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'.
|
||||
--
|
||||
-- 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} =
|
||||
let info = ":: {\"level\": " ++ (show $ fromEnum t) ++
|
||||
", \"last_checked\": " ++ formatTime defaultTimeLocale "%s" lc ++
|
||||
", \"delay\": " ++ (show $ fromEnum o) ++
|
||||
", \"delay\": " ++ (show $ nomToInteger o) ++
|
||||
"}"
|
||||
in unlines $ info : intersperse "::" s
|
||||
|
||||
|
|
@ -295,7 +303,7 @@ lastCheckedInfo = do
|
|||
offsetInfo :: Parser (Card -> Card)
|
||||
offsetInfo = do
|
||||
number <- field "delay"
|
||||
let o = fromInteger number
|
||||
let o = integerToNom number
|
||||
return (\card -> card {offset=o})
|
||||
|
||||
-- sides of a card
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue