module Graphics.QML.Internal.JobQueue ( postJob, processJobs ) where import Graphics.QML.Internal.BindCore import Control.Concurrent.MVar import System.IO.Unsafe {-# NOINLINE jobQueue #-} jobQueue :: MVar [IO ()] jobQueue :: MVar [IO ()] jobQueue = IO (MVar [IO ()]) -> MVar [IO ()] forall a. IO a -> a unsafePerformIO (IO (MVar [IO ()]) -> MVar [IO ()]) -> IO (MVar [IO ()]) -> MVar [IO ()] forall a b. (a -> b) -> a -> b $ [IO ()] -> IO (MVar [IO ()]) forall a. a -> IO (MVar a) newMVar [] postJob :: IO () -> IO () postJob :: IO () -> IO () postJob IO () j = do Bool notify <- MVar [IO ()] -> ([IO ()] -> IO ([IO ()], Bool)) -> IO Bool forall a b. MVar a -> (a -> IO (a, b)) -> IO b modifyMVar MVar [IO ()] jobQueue (([IO ()] -> IO ([IO ()], Bool)) -> IO Bool) -> ([IO ()] -> IO ([IO ()], Bool)) -> IO Bool forall a b. (a -> b) -> a -> b $ \[IO ()] js -> ([IO ()], Bool) -> IO ([IO ()], Bool) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return (IO () jIO () -> [IO ()] -> [IO ()] forall a. a -> [a] -> [a] :[IO ()] js,[IO ()] -> Bool forall a. [a] -> Bool forall (t :: * -> *) a. Foldable t => t a -> Bool null [IO ()] js) if Bool notify then IO () hsqmlEvloopNotifyJobs else () -> IO () forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return () processJobs :: IO () processJobs :: IO () processJobs = do [IO ()] js <- MVar [IO ()] -> ([IO ()] -> IO ([IO ()], [IO ()])) -> IO [IO ()] forall a b. MVar a -> (a -> IO (a, b)) -> IO b modifyMVar MVar [IO ()] jobQueue (([IO ()] -> IO ([IO ()], [IO ()])) -> IO [IO ()]) -> ([IO ()] -> IO ([IO ()], [IO ()])) -> IO [IO ()] forall a b. (a -> b) -> a -> b $ \[IO ()] js -> ([IO ()], [IO ()]) -> IO ([IO ()], [IO ()]) forall a. a -> IO a forall (m :: * -> *) a. Monad m => a -> m a return ([],[IO ()] js) [IO ()] -> IO () forall (t :: * -> *) (m :: * -> *) a. (Foldable t, Monad m) => t (m a) -> m () sequence_ ([IO ()] -> IO ()) -> [IO ()] -> IO () forall a b. (a -> b) -> a -> b $ [IO ()] -> [IO ()] forall a. [a] -> [a] reverse [IO ()] js