module JSDOM.Custom.Window (
    module Generated
  , openDatabase
) where

import Prelude ()
import Prelude.Compat
import Control.Monad.IO.Class (MonadIO(..))

import JSDOM.Types
       (withCallback, Callback(..), MonadDOM, ToJSString, Database, DatabaseCallback(..))

import JSDOM.Generated.Window as Generated hiding (openDatabase)
import qualified JSDOM.Generated.Window
       as Generated (openDatabase)
import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)
import JSDOM.Generated.DatabaseCallback
       (newDatabaseCallback)
import Data.Maybe (fromJust)

-- | <https://developer.mozilla.org/en-US/docs/Web/API/Window.openDatabase Mozilla Window.openDatabase documentation>
openDatabase :: (MonadDOM m, ToJSString name, ToJSString version, ToJSString displayName) =>
                Window -> name -> version -> displayName -> Word -> m Database
openDatabase :: Window -> name -> version -> displayName -> Word -> m Database
openDatabase Window
self name
name version
version displayName
displayName Word
estimatedSize = do
    MVar Database
result <- IO (MVar Database) -> m (MVar Database)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (MVar Database)
forall a. IO (MVar a)
newEmptyMVar
    JSM DatabaseCallback
-> (DatabaseCallback -> JSM Database) -> m Database
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback ((Database -> JSM ()) -> JSM DatabaseCallback
forall (m :: * -> *).
MonadDOM m =>
(Database -> JSM ()) -> m DatabaseCallback
newDatabaseCallback (IO () -> JSM ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> JSM ()) -> (Database -> IO ()) -> Database -> JSM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVar Database -> Database -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar Database
result)) ((DatabaseCallback -> JSM Database) -> m Database)
-> (DatabaseCallback -> JSM Database) -> m Database
forall a b. (a -> b) -> a -> b
$ \DatabaseCallback
creationCallback ->
        Window
-> name
-> version
-> displayName
-> Word
-> Maybe DatabaseCallback
-> JSM (Maybe Database)
forall (m :: * -> *) name version displayName.
(MonadDOM m, ToJSString name, ToJSString version,
 ToJSString displayName) =>
Window
-> name
-> version
-> displayName
-> Word
-> Maybe DatabaseCallback
-> m (Maybe Database)
Generated.openDatabase Window
self name
name version
version displayName
displayName Word
estimatedSize (DatabaseCallback -> Maybe DatabaseCallback
forall a. a -> Maybe a
Just DatabaseCallback
creationCallback)
            JSM (Maybe Database)
-> (Maybe Database -> JSM Database) -> JSM Database
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= JSM Database
-> (Database -> JSM Database) -> Maybe Database -> JSM Database
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (IO Database -> JSM Database
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (MVar Database -> IO Database
forall a. MVar a -> IO a
takeMVar MVar Database
result)) Database -> JSM Database
forall (m :: * -> *) a. Monad m => a -> m a
return