servant-pagination 2.5.0 → 2.5.1
raw patch · 4 files changed
+45/−22 lines, 4 filesdep ~servantdep ~servant-serverdep ~textnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: servant, servant-server, text
API changes (from Hackage documentation)
- Servant.Pagination: type family RangeType resource field :: *;
+ Servant.Pagination: addPageHeaders :: (ToHttpApiData (AcceptRanges fields), KnownSymbol field, HasPagination resource field, IsRangeType (RangeType resource field), PutRange fields field) => Range field (RangeType resource field) -> [resource] -> Headers (PageHeaders fields resource) [resource]
+ Servant.Pagination: type RangeType resource field :: *;
Files
- CHANGELOG.md +12/−4
- servant-pagination.cabal +4/−4
- src/Servant/Pagination.hs +28/−13
- stack.yaml +1/−1
CHANGELOG.md view
@@ -1,5 +1,13 @@ # Changelog +## Unreleased++- Move header logic to a pure addPageHeaders function #21++## v2.5.1 (2023-12-13)++- Bump `servant`, `servant-server`, `text` versions (see [#24](https://github.com/chordify/haskell-servant-pagination/pull/24)).+ ## v2.5.0 (2022-03-09) - Allow text-2.0 and servant-0.19 #20 - Expose PutRange so we can use this in integrations #18@@ -49,21 +57,21 @@ - Allow servant-0.14 -## v2.1.0 (2018-04-16) +## v2.1.0 (2018-04-16) - Add some tests (QuickCheck round-up & control some Ranges parsing) - Add `Show` and `Eq` instances for Ranges-- Expose `putRange` function +- Expose `putRange` function - Review `getDefaultRange` signature (remove Maybe argument) ## v2.0.0 (2018-04-06) - Review internal implementation and public API (ditch Range combinator to favor type-level- list and more discrete footprint). + list and more discrete footprint). - Remove 'Total-Count' header, can still be added on top of the range headers but isn't a Range- header so to speak. + header so to speak. - Extend haddock documentation to be more user-friendly
servant-pagination.cabal view
@@ -10,7 +10,7 @@ different fashions (pagination with offset / limit, endless scroll using last referenced resources, ascending and descending ordering, etc.) version:- 2.5.0+ 2.5.1 homepage: https://github.com/chordify/haskell-servant-pagination bug-reports:@@ -83,9 +83,9 @@ build-depends: base >= 4 && < 5- , text >= 1.2 && < 2.1- , servant >= 0.11 && < 0.20- , servant-server >= 0.11 && < 0.20+ , text >= 1.2 && < 2.2+ , servant >= 0.11 && < 0.21+ , servant-server >= 0.11 && < 0.21 , safe >= 0.3 && < 1 , uri-encode >= 1.5 && < 1.6
src/Servant/Pagination.hs view
@@ -113,6 +113,7 @@ -- * Use Ranges , extractRange , putRange+ , addPageHeaders , returnRange , applyRange ) where@@ -414,10 +415,12 @@ , rangeField = Proxy @field } --- | Lift an API response in a 'Monad', typically a 'Servant.Server.Handler'. 'Ranges' headers can be quite cumbersome to--- declare and can be deduced from the resources returned and the previous 'Range'. This is exactly what this function--- does.+-- | Add headers representing a 'Range' to a list of resources. --+-- 'Ranges' headers can be quite cumbersome to declare and can be deduced from a+-- collection of resources together with the 'Range' used to retrieve it, so this function+-- is a shortcut for that.+-- -- @ -- myHandler -- :: 'Maybe' ('Ranges' '["created_at"] Resource)@@ -426,11 +429,10 @@ -- let range = -- 'Data.Maybe.fromMaybe' ('getDefaultRange' ('Data.Proxy.Proxy' \@Resource)) (mrange >>= 'extractRange') ----- 'returnRange' range ('applyRange' range resources)+-- 'return' ('addPageHeaders' range ('applyRange' range resources)) -- @-returnRange- :: ( Monad m- , ToHttpApiData (AcceptRanges fields)+addPageHeaders+ :: ( ToHttpApiData (AcceptRanges fields) , KnownSymbol field , HasPagination resource field , IsRangeType (RangeType resource field)@@ -438,15 +440,14 @@ ) => Range field (RangeType resource field) -- ^ Actual 'Range' used to retrieve the results -> [resource] -- ^ Resources to return, fetched from a db or a local store- -> m (Headers (PageHeaders fields resource) [resource]) -- ^ Resources embedded in a given 'Monad' (typically a 'Servant.Server.Handler', with pagination headers)-returnRange Range{..} rs = do+ -> Headers (PageHeaders fields resource) [resource] -- ^ The same resources, but with pagination headers+addPageHeaders Range{..} rs = let boundaries = (,) <$> fmap (getFieldValue rangeField) (Safe.headMay rs) <*> fmap (getFieldValue rangeField) (Safe.lastMay rs)-- case boundaries of+ in case boundaries of Nothing ->- return $ addHeader AcceptRanges $ noHeader $ noHeader rs+ addHeader AcceptRanges $ noHeader $ noHeader rs Just (start, end) -> do let nextOffset | rangeValue == Just end = rangeOffset + length rs@@ -469,7 +470,21 @@ let addNextRange | length rs < rangeLimit = noHeader | otherwise = addHeader nextRange - return $ addHeader AcceptRanges $ addHeader contentRange $ addNextRange rs+ addHeader AcceptRanges $ addHeader contentRange $ addNextRange rs++-- | @'returnRange' range rs = 'return' ('addPageHeaders' range rs)@+returnRange+ :: ( Monad m+ , ToHttpApiData (AcceptRanges fields)+ , KnownSymbol field+ , HasPagination resource field+ , IsRangeType (RangeType resource field)+ , PutRange fields field+ )+ => Range field (RangeType resource field) -- ^ Actual 'Range' used to retrieve the results+ -> [resource] -- ^ Resources to return, fetched from a db or a local store+ -> m (Headers (PageHeaders fields resource) [resource]) -- ^ Resources embedded in a given 'Monad' (typically a 'Servant.Server.Handler', with pagination headers)+returnRange range rs = return (addPageHeaders range rs) -- | Default values to apply when parsing a 'Range' data RangeOptions = RangeOptions
stack.yaml view
@@ -1,4 +1,4 @@-resolver: lts-16.15+resolver: lts-14.25 # Generate files required by Weeder. # See https://github.com/ndmitchell/weeder/issues/53