blockfrost-api-0.1.0.0: src/Blockfrost/Util/Pagination.hs
-- | Pagination utilities
{-# OPTIONS_HADDOCK hide #-}
module Blockfrost.Util.Pagination
( Paged (..)
, Pagination
, PaginationExpanded
, page
, paged
, nextPage
, maxPageSize
) where
import Data.Default.Class
import Servant.API (QueryParam, (:>))
-- | Pagination parameters
data Paged = Paged
{ countPerPage :: Int -- ^ Count of results per page
, pageNumber :: Int -- ^ Page number
} deriving (Eq, Ord, Show)
-- | Maximum number of items per page
maxPageSize :: Int
maxPageSize = 100
instance Default Paged where
def = Paged maxPageSize 1
-- | Default `Paged` at specific page number
page :: Int -> Paged
page n | n >= 1 = def { pageNumber = n }
page _ = error "Page number not in range [1..]"
-- | Construct `Paged` from page size and page number.
--
-- Throws error on invalid values.
paged :: Int -> Int -> Paged
paged size _ | size > maxPageSize = error "Page size exceeds 100"
paged _ n | n < 1 = error "Page number not in range [1..]"
paged size n = Paged size n
-- | Increment page number
nextPage :: Paged -> Paged
nextPage p = p { pageNumber = 1 + pageNumber p }
-- | Adds Pagination to an API
data Pagination
type PaginationExpanded subApi =
QueryParam "count" Int
:> QueryParam "page" Int
:> subApi