pinboard 0.8.5 → 0.8.6
raw patch · 4 files changed
+39/−23 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Pinboard.Client.Types: runPinboardT :: PinboardEnv -> PinboardT m a -> m (Either PinboardError a)
+ Pinboard.Client.Types: type PinboardEnv = (PinboardConfig, Manager)
- Pinboard.Client: sendPinboardRequest :: MonadIO m => PinboardRequest -> PinboardConfig -> Manager -> (Response ByteString -> a) -> m a
+ Pinboard.Client: sendPinboardRequest :: MonadIO m => PinboardEnv -> PinboardRequest -> (Response ByteString -> a) -> m a
- Pinboard.Client.Types: type MonadPinboard m = (MonadIO m, MonadReader (PinboardConfig, Manager) m, MonadError PinboardError m)
+ Pinboard.Client.Types: type MonadPinboard m = (MonadIO m, MonadReader PinboardEnv m, MonadError PinboardError m)
- Pinboard.Client.Types: type PinboardT m a = ReaderT (PinboardConfig, Manager) (ExceptT PinboardError m) a
+ Pinboard.Client.Types: type PinboardT m a = ReaderT PinboardEnv (ExceptT PinboardError m) a
Files
- changelog.md +4/−0
- pinboard.cabal +1/−1
- src/Pinboard/Client.hs +12/−13
- src/Pinboard/Client/Types.hs +22/−9
changelog.md view
@@ -1,3 +1,7 @@+__v0.8.5__++replace Pinboard stack with PinboardT transfomer (use mtl style constraints instead of a fixed monad transformer stack)+ __v0.7.5__ replacing/removing io-streams in favor of http-client
pinboard.cabal view
@@ -1,5 +1,5 @@ name: pinboard-version: 0.8.5+version: 0.8.6 synopsis: Access to the Pinboard API license: MIT license-file: LICENSE
src/Pinboard/Client.hs view
@@ -50,7 +50,7 @@ ) where -import Control.Exception (catch, SomeException, try, bracket)+import Control.Exception (catch, SomeException, try) import Control.Monad.IO.Class import Control.Monad.Reader import Control.Monad.Except@@ -91,14 +91,15 @@ => PinboardConfig -> PinboardT m a -> m (Either PinboardError a)-runPinboard config requests = mgrOpenRaw >>= go- where go mgr = runExceptT $ runReaderT requests (config, mgr) +runPinboard config f = mgrOpenRaw >>= go+ where go mgr = runPinboardT (config, mgr) f + -- | Create a Pinboard value from a PinboardRequest w/ json deserialization pinboardJson :: (MonadPinboard m, FromJSON a) => PinboardRequest -> m a pinboardJson req = do - (config, mgr) <- ask- res <- sendPinboardRequest (ensureResultFormatType FormatJson req) config mgr parseJSONResponse+ env <- ask+ res <- sendPinboardRequest env (ensureResultFormatType FormatJson req) parseJSONResponse res --------------------------------------------------------------------------------@@ -109,9 +110,8 @@ -> PinboardRequest -> (Response LBS.ByteString -> a) -> m (Either PinboardError a)-runPinboardSingleRaw config req handler = - liftIO $ bracket mgrOpen return (either (mgrFail ConnectionFailure) go)- where go mgr = (Right <$> sendPinboardRequest req config mgr handler)+runPinboardSingleRaw config req handler = liftIO $ mgrOpenRaw >>= go+ where go mgr = (Right <$> sendPinboardRequest (config, mgr) req handler) `catch` mgrFail UnknownErrorType runPinboardSingleRawBS@@ -137,12 +137,11 @@ sendPinboardRequest :: MonadIO m- => PinboardRequest - -> PinboardConfig - -> Manager+ => PinboardEnv+ -> PinboardRequest -> (Response LBS.ByteString -> a) -> m a-sendPinboardRequest PinboardRequest{..} PinboardConfig{..} man handler = do+sendPinboardRequest (PinboardConfig{..}, man) PinboardRequest{..} handler = do let url = T.concat [ requestPath , "?" , T.decodeUtf8 $ paramsToByteString $ ("auth_token", urlEncode False apiToken) : encodeParams requestParams ]@@ -156,7 +155,7 @@ buildReq url = do req <- liftIO $ parseUrl $ "https://api.pinboard.in/v1/" <> url return $ req - { requestHeaders = [("User-Agent","pinboard.hs/0.8.5")]+ { requestHeaders = [("User-Agent","pinboard.hs/0.8.6")] , checkStatus = \_ _ _ -> Nothing }
src/Pinboard/Client/Types.hs view
@@ -9,7 +9,9 @@ -- Stability : experimental -- Portability : POSIX module Pinboard.Client.Types- ( PinboardT+ ( PinboardEnv+ , PinboardT+ , runPinboardT , MonadPinboard , PinboardRequest (..) , PinboardConfig (..)@@ -19,26 +21,37 @@ ) where import Control.Monad.Reader (ReaderT)+import Control.Monad.Reader.Class (MonadReader)+import Control.Monad.Trans.Except (ExceptT, runExceptT)+import Control.Monad.Trans.Reader (runReaderT)+import Control.Monad.Error.Class (MonadError)+import Control.Monad.IO.Class (MonadIO)+ import Data.ByteString (ByteString) import Data.Text (Text)-import Network.HTTP.Client (Manager)-import Pinboard.Client.Error (PinboardError (..)) import Data.Time.Calendar(Day) import Data.Time.Clock(UTCTime)-import Control.Monad.Reader.Class(MonadReader)-import Control.Monad.Error.Class(MonadError)-import Control.Monad.IO.Class(MonadIO)-import Control.Monad.Except(ExceptT)+import Network.HTTP.Client (Manager) +import Pinboard.Client.Error (PinboardError (..))+ ------------------------------------------------------------------------------ -type PinboardT m a = ReaderT (PinboardConfig, Manager) (ExceptT PinboardError m) a+type PinboardEnv = (PinboardConfig, Manager) +type PinboardT m a = ReaderT PinboardEnv (ExceptT PinboardError m) a++runPinboardT + :: PinboardEnv+ -> PinboardT m a+ -> m (Either PinboardError a)+runPinboardT e f = runExceptT (runReaderT f e)+ -- |Typeclass alias for the return type of the API functions (keeps the -- signatures less verbose) type MonadPinboard m = ( MonadIO m- , MonadReader (PinboardConfig, Manager) m+ , MonadReader PinboardEnv m , MonadError PinboardError m )