module SWTasks(TaskQueue, mkTaskQueue, later) where import Graphics.UI.WX data TaskQueue = TQ (Var [IO ()]) Timer mkTaskQueue :: Window a -> IO TaskQueue mkTaskQueue w = do vtasks <- varCreate [] let doTask = do xs <- varGet vtasks case xs of [] -> return () (task:tasks) -> do -- set tim [ enable := False ] varSet vtasks tasks putStrLn "doing task" task -- set tim [ enable := not (null tasks) ] tim <- timer w [interval := 50, on command := doTask, enabled := False] return (TQ vtasks tim) later :: TaskQueue -> IO () -> IO () later (TQ vtasks tim) task = do tasks <- varGet vtasks varSet vtasks (tasks ++ [task]) set tim [ enabled := True, interval := 50 ]