@@ -5,7 +5,6 @@ module Network.HTTP.Affjax
55 , AffjaxResponse
66 , URL
77 , affjax
8- , affjax'
98 , get
109 , post , post_ , post' , post_'
1110 , put , put_ , put' , put_'
@@ -19,21 +18,22 @@ module Network.HTTP.Affjax
1918
2019import Prelude hiding (max )
2120
22- import Control.Monad.Aff (Aff , makeAff , makeAff' , Canceler (..), attempt , delay , forkAff , cancel )
23- import Control.Monad.Aff.AVar ( AVAR , makeVar , takeVar , putVar )
24- import Control.Monad.Eff (kind Effect , Eff )
21+ import Control.Monad.Aff (Aff , try , delay )
22+ import Control.Monad.Aff.Compat as AC
23+ import Control.Monad.Eff (kind Effect )
2524import Control.Monad.Eff.Class (liftEff )
2625import Control.Monad.Eff.Exception (Error , error )
2726import Control.Monad.Eff.Ref (REF , newRef , readRef , writeRef )
2827import Control.Monad.Except (runExcept , throwError )
28+ import Control.Parallel (parOneOf )
2929
3030import Data.Argonaut.Parser (jsonParser )
3131import Data.Array as Arr
3232import Data.Either (Either (..), either )
3333import Data.Foldable (any )
3434import Data.Foreign (F , Foreign , ForeignError (JSONError), fail , readString , toForeign )
3535import Data.Function (on )
36- import Data.Function.Uncurried (Fn5 , runFn5 , Fn4 , runFn4 )
36+ import Data.Function.Uncurried (Fn2 , runFn2 )
3737import Data.HTTP.Method (Method (..), CustomMethod )
3838import Data.HTTP.Method as Method
3939import Data.Int (toNumber )
@@ -45,8 +45,6 @@ import Data.Tuple (Tuple(..), fst, snd)
4545
4646import Math (max , pow )
4747
48- import DOM.XHR.Types (XMLHttpRequest )
49-
5048import Network.HTTP.Affjax.Request (class Requestable , RequestContent , toRequest )
5149import Network.HTTP.Affjax.Response (class Respondable , ResponseContent , ResponseType (..), fromResponse , responseType , responseTypeToString )
5250import Network.HTTP.RequestHeader (RequestHeader (..), requestHeaderName , requestHeaderValue )
@@ -90,10 +88,6 @@ type AffjaxResponse a =
9088-- | Type alias for URL strings to aid readability of types.
9189type URL = String
9290
93- -- | Makes an `Affjax` request.
94- affjax :: forall e a b . Requestable a => Respondable b => AffjaxRequest a -> Affjax e b
95- affjax = makeAff' <<< affjax'
96-
9791-- | Makes a `GET` request to the specified URL.
9892get :: forall e a . Respondable a => URL -> Affjax e a
9993get u = affjax $ defaultRequest { url = u }
@@ -186,23 +180,16 @@ retry
186180 :: forall e a b
187181 . Requestable a
188182 => RetryPolicy
189- -> (AffjaxRequest a -> Affjax (avar :: AVAR , ref :: REF | e ) b )
190- -> (AffjaxRequest a -> Affjax (avar :: AVAR , ref :: REF | e ) b )
183+ -> (AffjaxRequest a -> Affjax (ref :: REF | e ) b )
184+ -> (AffjaxRequest a -> Affjax (ref :: REF | e ) b )
191185retry policy run req = do
192186 -- failureRef is either an exception or a failed request
193187 failureRef <- liftEff $ newRef Nothing
194188 let loop = go failureRef
195189 case policy.timeout of
196190 Nothing -> loop 1
197191 Just timeout -> do
198- respVar <- makeVar
199- loopHandle <- forkAff $ loop 1 >>= putVar respVar <<< Just
200- timeoutHandle <-
201- forkAff $ do
202- delay timeout
203- putVar respVar Nothing
204- loopHandle `cancel` error " Cancel"
205- result <- takeVar respVar
192+ result <- parOneOf [ Just <$> loop 1 , Nothing <$ delay timeout ]
206193 case result of
207194 Nothing -> do
208195 failure <- liftEff $ readRef failureRef
@@ -225,25 +212,26 @@ retry policy run req = do
225212 Right resp
226213
227214 go failureRef n = do
228- result <- retryState <$> attempt (run req)
215+ result <- retryState <$> try (run req)
229216 case result of
230217 Left err -> do
231218 liftEff $ writeRef failureRef $ Just err
232219 delay (policy.delayCurve n)
233220 go failureRef (n + 1 )
234221 Right resp -> pure resp
235222
236- -- | Run a request directly without using `Aff` .
237- affjax'
223+ -- | Makes an `Affjax` request .
224+ affjax
238225 :: forall e a b
239226 . Requestable a
240227 => Respondable b
241228 => AffjaxRequest a
242- -> (Error -> Eff (ajax :: AJAX | e ) Unit )
243- -> (AffjaxResponse b -> Eff (ajax :: AJAX | e ) Unit )
244- -> Eff (ajax :: AJAX | e ) (Canceler (ajax :: AJAX | e ))
245- affjax' req eb cb =
246- runFn5 _ajax responseHeader req' cancelAjax eb cb'
229+ -> Affjax e b
230+ affjax req = do
231+ res <- AC .fromEffFnAff $ runFn2 _ajax responseHeader req'
232+ case res { response = _ } <$> runExcept (fromResponse' res.response) of
233+ Left err -> throwError $ error (show err)
234+ Right res' -> pure res'
247235 where
248236
249237 req' :: AjaxRequest
@@ -277,11 +265,6 @@ affjax' req eb cb =
277265 Just h | not $ any (on eq requestHeaderName h) hs -> hs `Arr.snoc` h
278266 _ -> hs
279267
280- cb' :: AffjaxResponse ResponseContent -> Eff (ajax :: AJAX | e ) Unit
281- cb' res = case res { response = _ } <$> runExcept (fromResponse' res .response ) of
282- Left err -> eb $ error (show err )
283- Right res' -> cb res'
284-
285268 parseJSON :: String -> F Foreign
286269 parseJSON = either (fail <<< JSONError ) (pure <<< toForeign) <<< jsonParser
287270
@@ -301,20 +284,4 @@ type AjaxRequest =
301284 , withCredentials :: Boolean
302285 }
303286
304- foreign import _ajax
305- :: forall e . Fn5 (String -> String -> ResponseHeader )
306- AjaxRequest
307- (XMLHttpRequest -> Canceler (ajax :: AJAX | e ))
308- (Error -> Eff (ajax :: AJAX | e ) Unit )
309- (AffjaxResponse Foreign -> Eff (ajax :: AJAX | e ) Unit )
310- (Eff (ajax :: AJAX | e ) (Canceler (ajax :: AJAX | e )))
311-
312- cancelAjax :: forall e . XMLHttpRequest -> Canceler (ajax :: AJAX | e )
313- cancelAjax xhr = Canceler \err -> makeAff (\eb cb -> runFn4 _cancelAjax xhr err eb cb)
314-
315- foreign import _cancelAjax
316- :: forall e . Fn4 XMLHttpRequest
317- Error
318- (Error -> Eff (ajax :: AJAX | e ) Unit )
319- (Boolean -> Eff (ajax :: AJAX | e ) Unit )
320- (Eff (ajax :: AJAX | e ) Unit )
287+ foreign import _ajax :: forall e . Fn2 (String -> String -> ResponseHeader ) AjaxRequest (AC.EffFnAff (ajax :: AJAX | e ) (AffjaxResponse Foreign ))
0 commit comments