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 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)]
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@ dependencies:
|
||||||
- transformers
|
- transformers
|
||||||
- haskeline
|
- haskeline
|
||||||
- megaparsec
|
- megaparsec
|
||||||
|
- random
|
||||||
|
- random-shuffle
|
||||||
|
|
||||||
library:
|
library:
|
||||||
source-dirs: src
|
source-dirs: src
|
||||||
|
|
|
||||||
18
src/Cards.hs
18
src/Cards.hs
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue