haste-gapi-0.1.0.0: Haste/GAPI/Request.hs
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Haste.GAPI.Request
Description : Contains everything Request-related
Copyright : (c) Jonathan Skårstedt, 2016
License : MIT
Maintainer : jonathan.skarstedt@gmail.com
Stability : experimental
Portability : Haste
Contains RequestM and run functions.
-}
module Haste.GAPI.Request (
RequestM (..),
Request (..),
Result(..),
Path (..),
runR, runRConc,
request, request',
has, get, hasAll, val, valOf, children,
lookupResult, lookupVal,
-- | Perform an IO Action inside RequestM
liftIO,
-- | Perform a CIO Action inside RequestM
liftConc,
-- | === Constructing parameters
Params(),
parp, merge, pcons, params
) where
import Haste.GAPI.Internals.Promise
import Haste.GAPI.Request.RequestM
import Haste.GAPI.Request.Types (
Path,
Params(..), Request(..),
merge, pcons, params,
rawRequest)
import Haste.GAPI.Request.Raw
import Haste.GAPI.Result
import qualified Haste.JSString as J
import Haste.Foreign hiding (has, get, hasAll)
import Haste.Concurrent
import Data.Default
import Control.Monad
import Control.Applicative
-- | Runs the request eDSL
runR :: RequestM () -> IO ()
runR = concurrent . void . unR
-- | Runs the request eDSL from a concurrent context
runRConc :: RequestM () -> CIO ()
runRConc = void . unR
-- | Creates a request from an API path and a series of parameters.
request :: Path -> Params -> RequestM (Result a)
request p ps = customRequest (rawRequest p ps)
-- | Performs a request from an API path but without parameters
request' :: Path -> RequestM (Result a)
request' p = customRequest (rawRequest p def)
-- | Creates a request using a custom request
customRequest :: Request -> RequestM (Result a)
customRequest req = do
v <- newEmptyMVar
liftConc . fork . liftIO $ do
resp <- jsCreateRequest (path req) (toAny $ rparams req)
applyPromise resp $ Promise (concurrent . putMVar v . Right . toResult)
(\_r -> concurrent . putMVar v . Left . J.pack $
"Request error: " ++ show req)
Req $ takeMVar v