----------------------------------------------------------------------------- -- Copyright 2019, Advise-Me project team. This file is distributed under -- the terms of the Apache License 2.0. For more information, see the files -- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution. ----------------------------------------------------------------------------- -- | -- Maintainer : bastiaan.heeren@ou.nl -- Stability : provisional -- Portability : portable (depends on ghc) -- ----------------------------------------------------------------------------- module Service.Sequencer where import System.Random import qualified Database.HDBC as SQL import qualified Database.HDBC.Sqlite3 as SQL (connectSqlite3, setBusyTimeout) import Ideas.Common.Library import Ideas.Service.Types hiding (tUserId) import Recognize.Data.MathStoryProblem import Recognize.Data.Solution import Main.Tasks import Service.Types import Database.Data ( StudentID, tasksDone ) sequencer :: StudentID -> IO (Maybe (Exercise a)) sequencer uid = do conn <- SQL.connectSqlite3 "advise-me.db" done <- tasksDone conn uid let undone = filter (\t -> not $ showId t `elem` done) tasks i <- randomRIO (0, length undone-1) if null undone then return Nothing else case undone !! i of Task e -> return . Just . getExercise $ e sequencerService :: Service sequencerService = makeService "advise-me-next-task" "Sequencer service for Advise-Me project" $ sequencer ::: tUserIdTag .-> tIO (tMaybe tExercise)