#ifdef ghcjs_HOST_OS
#endif
module Language.Javascript.JSaddle.Monad (
JSM(..)
, JSContextRef
, MonadJSM
, liftJSM
, askJSM
, runJSM
, runJSaddle
, syncPoint
, syncAfter
, waitForAnimationFrame
, nextAnimationFrame
, catch
, bracket
) where
import Prelude hiding (read)
#ifndef ghcjs_HOST_OS
import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
#endif
import Control.Monad.IO.Class (MonadIO(..))
import qualified Control.Exception as E (Exception, catch, bracket)
import Language.Javascript.JSaddle.Types (JSM(..), MonadJSM, liftJSM, JSContextRef(..))
import Language.Javascript.JSaddle.Run (syncPoint, syncAfter, waitForAnimationFrame, nextAnimationFrame)
askJSM :: MonadJSM m => m JSContextRef
#ifdef ghcjs_HOST_OS
askJSM = return ()
#else
askJSM = liftJSM $ JSM ask
#endif
runJSM :: MonadIO m => JSM a -> JSContextRef -> m a
#ifdef ghcjs_HOST_OS
runJSM f = liftIO . const f
#else
runJSM f = liftIO . runReaderT (unJSM f)
#endif
runJSaddle :: MonadIO m => JSContextRef -> JSM a -> m a
runJSaddle = flip runJSM
catch :: E.Exception e
=> JSM b
-> (e -> JSM b)
-> JSM b
t `catch` c = do
r <- askJSM
liftIO (runJSM (syncAfter t) r `E.catch` \e -> runJSM (c e) r)
bracket :: JSM a -> (a -> JSM b) -> (a -> JSM c) -> JSM c
bracket aquire release f = do
r <- askJSM
liftIO $ E.bracket
(runJSM (syncAfter aquire) r)
(\x -> runJSM (syncAfter $ release x) r)
(\x -> runJSM (syncAfter $ f x) r)