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