eurofxref 0.1.2 → 0.2.0
raw patch · 3 files changed
+35/−32 lines, 3 filesdep +conduitdep +http-conduitdep +monad-controldep −enumeratordep −http-enumeratordep ~containersdep ~failuredep ~hexpatPVP ok
version bump matches the API change (PVP)
Dependencies added: conduit, http-conduit, monad-control
Dependencies removed: enumerator, http-enumerator
Dependency ranges changed: containers, failure, hexpat, http-types, mtl, time
API changes (from Hackage documentation)
- Financial.EuroFXRef: europeanCentralBankDaily :: Failure HttpException m => m (Request m)
+ Financial.EuroFXRef: europeanCentralBankDaily :: Failure HttpException m => m (Request m')
- Financial.EuroFXRef: fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) => Request m -> m (Rates a)
+ Financial.EuroFXRef: fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadResource m, MonadBaseControl IO m, Read a) => Request m -> Manager -> m (Rates a)
Files
- Financial/EuroFXRef.hs +21/−26
- eurofxref.cabal +13/−5
- example.hs +1/−1
Financial/EuroFXRef.hs view
@@ -27,15 +27,13 @@ import Control.Exception import Control.Failure import Control.Monad.State.Strict-import qualified Data.ByteString as B-import Data.Enumerator (Iteratee (..), run_)-import Data.Enumerator.List (consume)+import Control.Monad.Trans.Control+import Data.Conduit (MonadResource, runResourceT, ResourceT) import qualified Data.Map as M-import Data.Monoid import Data.Time.Calendar import Data.Time.Clock import Data.Typeable-import Network.HTTP.Enumerator as HTTP+import Network.HTTP.Conduit as HTTP import Network.HTTP.Types as HTTP import Text.XML.Expat.Tree @@ -92,42 +90,39 @@ parseEuropeanCentralBank _ = Left "element expected at top level" -- | The URL for the European Central Bank's free daily reference rates.-europeanCentralBankDaily :: Failure HttpException m => m (HTTP.Request m)+europeanCentralBankDaily :: Failure HttpException m => m (HTTP.Request m') europeanCentralBankDaily = parseUrl "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml" -- | Fetch today's currency rates from the specified URL. -- -- Throws a 'EuropeanCentralBankException' for failures at HTTP and above, -- or 'IOException' for network-level failures.-fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) =>+fetchFrom :: (Failure EuropeanCentralBankException m, Failure HttpException m,+ MonadResource m, MonadBaseControl IO m, Read a) => HTTP.Request m+ -> HTTP.Manager -> m (Rates a)-fetchFrom req = do- mgr <- liftIO newManager- run_ $ httpRedirect req processResponse mgr--processResponse :: (Failure EuropeanCentralBankException m, Read a) =>- HTTP.Status- -> ResponseHeaders- -> Iteratee B.ByteString m (Rates a)-processResponse status@(Status statusCode _) headers = do- body <- mconcat <$> consume- case statusCode of+fetchFrom req mgr = do+ res <- httpLbs req mgr+ let body = responseBody res+ case statusCode (responseStatus res) of 200 -> do- case parse' defaultParseOptions body of- Left err -> lift $ failure $ ECBXMLParseException err- Right xml ->+ case parse defaultParseOptions body of+ (_, Just err) -> failure $ ECBXMLParseException err+ (xml, _) -> case parseEuropeanCentralBank xml of- Left err -> lift $ failure $ ECBParseException err+ Left err -> failure $ ECBParseException err Right rates -> return rates- _ -> lift $ failure $ ECBHttpStatusException status+ _ -> failure $ ECBHttpStatusException (responseStatus res) -- | Fetch today's currency rates from European Central Bank server. -- 'IO' works for @m@ and 'Double' for @a@. -- -- Throws a 'EuropeanCentralBankException' for failures at HTTP and above, -- or 'IOException' for network-level failures.-fetch :: (Failure EuropeanCentralBankException m, Failure HttpException m, MonadIO m, Read a) =>+fetch :: (Failure EuropeanCentralBankException m, Failure HttpException m,+ MonadIO m, Read a) => m (Rates a)-fetch = fetchFrom =<< europeanCentralBankDaily-+fetch = do+ req <- europeanCentralBankDaily+ liftIO $ withManager $ fetchFrom req
eurofxref.cabal view
@@ -1,5 +1,5 @@ name: eurofxref-version: 0.1.2+version: 0.2.0 cabal-version: >=1.6 build-type: Simple license: BSD3@@ -20,10 +20,18 @@ data-files: example.hs Library- build-depends: base >=4 && <5, bytestring == 0.9.*, containers >= 0.2 && < 0.5,- enumerator >= 0.4.7 && < 0.5, failure == 0.1.*, http-enumerator == 0.6.*,- http-types == 0.6.*, hexpat >= 0.19.6 && < 0.20, mtl < 2.1,- time == 1.2.*+ build-depends:+ base >=4 && <5,+ bytestring == 0.9.*,+ containers >= 0.2 && < 0.6,+ failure >= 0.1,+ monad-control == 0.3.*,+ conduit == 0.5.*,+ http-conduit == 1.5.*,+ http-types >= 0.6.0 && < 0.8.0,+ hexpat >= 0.20.0 && < 0.21,+ mtl >= 2.0.0.0 && < 2.2.0.0,+ time >= 1.2.0.0 && < 1.5.0.0 exposed-modules: Financial.CurrencyRates, Financial.EuroFXRef exposed: True buildable: True
example.hs view
@@ -1,5 +1,5 @@ import Financial.EuroFXRef-import Network.HTTP.Enumerator (parseUrl)+import Network.HTTP.Conduit (parseUrl) import Control.Applicative import Control.Exception import Control.Monad