{-# LANGUAGE FlexibleContexts #-}
module JSDOM.Custom.Database (
    module Generated
  , changeVersion'
  , changeVersion
  , transaction'
  , transaction
  , readTransaction'
  , readTransaction
) where

import Data.Maybe (fromJust, maybe)

import Control.Monad.IO.Class (MonadIO(..))
import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)

import JSDOM.Types
       (MonadDOM, SQLTransaction, SQLError, DOM,
        SQLTransactionCallback(..), ToJSString(..), Callback(..), withCallback,
        SQLTransactionErrorCallback(..), VoidCallback(..))

import JSDOM.Custom.SQLError (throwSQLException)
import JSDOM.Generated.SQLTransactionCallback (newSQLTransactionCallbackSync)
import JSDOM.Generated.Database as Generated hiding (changeVersion, transaction, readTransaction)
import qualified JSDOM.Generated.Database as Generated (changeVersion, transaction, readTransaction)
import JSDOM.Generated.SQLTransactionErrorCallback
       (newSQLTransactionErrorCallback)
import JSDOM.Generated.VoidCallback
       (newVoidCallback)

withSQLTransactionCallback :: MonadDOM m => (SQLTransaction -> DOM ()) -> (SQLTransactionCallback -> DOM a) -> m a
withSQLTransactionCallback :: forall (m :: * -> *) a.
MonadDOM m =>
(SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> DOM a) -> m a
withSQLTransactionCallback SQLTransaction -> DOM ()
callback = JSM SQLTransactionCallback
-> (SQLTransactionCallback -> JSM a) -> m a
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback ((SQLTransaction -> DOM ()) -> JSM SQLTransactionCallback
forall (m :: * -> *).
MonadDOM m =>
(SQLTransaction -> DOM ()) -> m SQLTransactionCallback
newSQLTransactionCallbackSync SQLTransaction -> DOM ()
callback)

withSQLErrorCallbacks :: MonadDOM m => (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ()) -> m (Maybe SQLError)
withSQLErrorCallbacks :: forall (m :: * -> *).
MonadDOM m =>
(Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
withSQLErrorCallbacks Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ()
f = do
    MVar (Maybe SQLError)
result <- IO (MVar (Maybe SQLError)) -> m (MVar (Maybe SQLError))
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (MVar (Maybe SQLError))
forall a. IO (MVar a)
newEmptyMVar
    JSM SQLTransactionErrorCallback
-> (SQLTransactionErrorCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback ((SQLError -> DOM ()) -> JSM SQLTransactionErrorCallback
forall (m :: * -> *).
MonadDOM m =>
(SQLError -> DOM ()) -> m SQLTransactionErrorCallback
newSQLTransactionErrorCallback (IO () -> DOM ()
forall a. IO a -> JSM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> DOM ()) -> (SQLError -> IO ()) -> SQLError -> DOM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVar (Maybe SQLError) -> Maybe SQLError -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Maybe SQLError)
result (Maybe SQLError -> IO ())
-> (SQLError -> Maybe SQLError) -> SQLError -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SQLError -> Maybe SQLError
forall a. a -> Maybe a
Just)) ((SQLTransactionErrorCallback -> JSM (Maybe SQLError))
 -> m (Maybe SQLError))
-> (SQLTransactionErrorCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \SQLTransactionErrorCallback
error ->
        JSM VoidCallback
-> (VoidCallback -> JSM (Maybe SQLError)) -> JSM (Maybe SQLError)
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback (DOM () -> JSM VoidCallback
forall (m :: * -> *). MonadDOM m => DOM () -> m VoidCallback
newVoidCallback (DOM () -> JSM VoidCallback) -> DOM () -> JSM VoidCallback
forall a b. (a -> b) -> a -> b
$ IO () -> DOM ()
forall a. IO a -> JSM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> DOM ()) -> IO () -> DOM ()
forall a b. (a -> b) -> a -> b
$ MVar (Maybe SQLError) -> Maybe SQLError -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Maybe SQLError)
result Maybe SQLError
forall a. Maybe a
Nothing) ((VoidCallback -> JSM (Maybe SQLError)) -> JSM (Maybe SQLError))
-> (VoidCallback -> JSM (Maybe SQLError)) -> JSM (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \VoidCallback
success -> do
            Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ()
f (SQLTransactionErrorCallback -> Maybe SQLTransactionErrorCallback
forall a. a -> Maybe a
Just SQLTransactionErrorCallback
error) (VoidCallback -> Maybe VoidCallback
forall a. a -> Maybe a
Just VoidCallback
success)
            IO (Maybe SQLError) -> JSM (Maybe SQLError)
forall a. IO a -> JSM a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe SQLError) -> JSM (Maybe SQLError))
-> IO (Maybe SQLError) -> JSM (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ MVar (Maybe SQLError) -> IO (Maybe SQLError)
forall a. MVar a -> IO a
takeMVar MVar (Maybe SQLError)
result

-- | <https://developer.mozilla.org/en-US/docs/Web/API/Database.changeVersion Mozilla Database.changeVersion documentation>
changeVersion' :: (MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
                  Database -> oldVersion -> newVersion -> Maybe (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
changeVersion' :: forall (m :: * -> *) oldVersion newVersion.
(MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
Database
-> oldVersion
-> newVersion
-> Maybe (SQLTransaction -> DOM ())
-> m (Maybe SQLError)
changeVersion' Database
self oldVersion
oldVersion newVersion
newVersion Maybe (SQLTransaction -> DOM ())
Nothing = (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
(Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
withSQLErrorCallbacks ((Maybe SQLTransactionErrorCallback
  -> Maybe VoidCallback -> DOM ())
 -> m (Maybe SQLError))
-> (Maybe SQLTransactionErrorCallback
    -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ Database
-> oldVersion
-> newVersion
-> Maybe SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> DOM ()
forall (m :: * -> *) oldVersion newVersion.
(MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
Database
-> oldVersion
-> newVersion
-> Maybe SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> m ()
Generated.changeVersion Database
self oldVersion
oldVersion newVersion
newVersion Maybe SQLTransactionCallback
forall a. Maybe a
Nothing
changeVersion' Database
self oldVersion
oldVersion newVersion
newVersion (Just SQLTransaction -> DOM ()
callback) =
    (SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall (m :: * -> *) a.
MonadDOM m =>
(SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> DOM a) -> m a
withSQLTransactionCallback SQLTransaction -> DOM ()
callback ((SQLTransactionCallback -> JSM (Maybe SQLError))
 -> m (Maybe SQLError))
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \SQLTransactionCallback
transaction ->
        (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
(Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
withSQLErrorCallbacks ((Maybe SQLTransactionErrorCallback
  -> Maybe VoidCallback -> DOM ())
 -> JSM (Maybe SQLError))
-> (Maybe SQLTransactionErrorCallback
    -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s ->
            Database
-> oldVersion
-> newVersion
-> Maybe SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> DOM ()
forall (m :: * -> *) oldVersion newVersion.
(MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
Database
-> oldVersion
-> newVersion
-> Maybe SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> m ()
Generated.changeVersion Database
self oldVersion
oldVersion newVersion
newVersion (SQLTransactionCallback -> Maybe SQLTransactionCallback
forall a. a -> Maybe a
Just SQLTransactionCallback
transaction) Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s

changeVersion :: (MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
                 Database -> oldVersion -> newVersion -> Maybe (SQLTransaction -> DOM ()) -> m ()
changeVersion :: forall (m :: * -> *) oldVersion newVersion.
(MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
Database
-> oldVersion
-> newVersion
-> Maybe (SQLTransaction -> DOM ())
-> m ()
changeVersion Database
self oldVersion
oldVersion newVersion
newVersion Maybe (SQLTransaction -> DOM ())
callback =
    Database
-> oldVersion
-> newVersion
-> Maybe (SQLTransaction -> DOM ())
-> m (Maybe SQLError)
forall (m :: * -> *) oldVersion newVersion.
(MonadDOM m, ToJSString oldVersion, ToJSString newVersion) =>
Database
-> oldVersion
-> newVersion
-> Maybe (SQLTransaction -> DOM ())
-> m (Maybe SQLError)
changeVersion' Database
self oldVersion
oldVersion newVersion
newVersion Maybe (SQLTransaction -> DOM ())
callback m (Maybe SQLError) -> (Maybe SQLError -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m () -> (SQLError -> m ()) -> Maybe SQLError -> m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) SQLError -> m ()
forall (m :: * -> *) a. MonadDOM m => SQLError -> m a
throwSQLException

-- | <https://developer.mozilla.org/en-US/docs/Web/API/Database.transaction Mozilla Database.transaction documentation>
transaction' :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
transaction' :: forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
transaction' Database
self SQLTransaction -> DOM ()
callback =
    (SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall (m :: * -> *) a.
MonadDOM m =>
(SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> DOM a) -> m a
withSQLTransactionCallback SQLTransaction -> DOM ()
callback ((SQLTransactionCallback -> JSM (Maybe SQLError))
 -> m (Maybe SQLError))
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \SQLTransactionCallback
transaction ->
        (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
(Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
withSQLErrorCallbacks ((Maybe SQLTransactionErrorCallback
  -> Maybe VoidCallback -> DOM ())
 -> JSM (Maybe SQLError))
-> (Maybe SQLTransactionErrorCallback
    -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s ->
            Database
-> SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> DOM ()
forall (m :: * -> *).
MonadDOM m =>
Database
-> SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> m ()
Generated.transaction Database
self SQLTransactionCallback
transaction Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s

transaction :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m ()
transaction :: forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m ()
transaction Database
self SQLTransaction -> DOM ()
callback = Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
transaction' Database
self SQLTransaction -> DOM ()
callback m (Maybe SQLError) -> (Maybe SQLError -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m () -> (SQLError -> m ()) -> Maybe SQLError -> m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) SQLError -> m ()
forall (m :: * -> *) a. MonadDOM m => SQLError -> m a
throwSQLException

-- | <https://developer.mozilla.org/en-US/docs/Web/API/Database.readTransaction Mozilla Database.readTransaction documentation>
readTransaction' :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
readTransaction' :: forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
readTransaction' Database
self SQLTransaction -> DOM ()
callback =
    (SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall (m :: * -> *) a.
MonadDOM m =>
(SQLTransaction -> DOM ())
-> (SQLTransactionCallback -> DOM a) -> m a
withSQLTransactionCallback SQLTransaction -> DOM ()
callback ((SQLTransactionCallback -> JSM (Maybe SQLError))
 -> m (Maybe SQLError))
-> (SQLTransactionCallback -> JSM (Maybe SQLError))
-> m (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \SQLTransactionCallback
transaction ->
        (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
(Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ())
-> m (Maybe SQLError)
withSQLErrorCallbacks ((Maybe SQLTransactionErrorCallback
  -> Maybe VoidCallback -> DOM ())
 -> JSM (Maybe SQLError))
-> (Maybe SQLTransactionErrorCallback
    -> Maybe VoidCallback -> DOM ())
-> JSM (Maybe SQLError)
forall a b. (a -> b) -> a -> b
$ \Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s ->
            Database
-> SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> DOM ()
forall (m :: * -> *).
MonadDOM m =>
Database
-> SQLTransactionCallback
-> Maybe SQLTransactionErrorCallback
-> Maybe VoidCallback
-> m ()
Generated.readTransaction Database
self SQLTransactionCallback
transaction Maybe SQLTransactionErrorCallback
e Maybe VoidCallback
s

readTransaction :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m ()
readTransaction :: forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m ()
readTransaction Database
self SQLTransaction -> DOM ()
callback = Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
forall (m :: * -> *).
MonadDOM m =>
Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError)
readTransaction' Database
self SQLTransaction -> DOM ()
callback m (Maybe SQLError) -> (Maybe SQLError -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= m () -> (SQLError -> m ()) -> Maybe SQLError -> m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) SQLError -> m ()
forall (m :: * -> *) a. MonadDOM m => SQLError -> m a
throwSQLException