{-# OPTIONS_HADDOCK hide #-}
module Blockfrost.Util.Pagination
( Paged (..)
, Pagination
, PaginationExpanded
, page
, paged
, nextPage
, maxPageSize
) where
import Data.Default.Class
import Servant.API (QueryParam, (:>))
data Paged = Paged
{ Paged -> Int
countPerPage :: Int
, Paged -> Int
pageNumber :: Int
} deriving (Paged -> Paged -> Bool
(Paged -> Paged -> Bool) -> (Paged -> Paged -> Bool) -> Eq Paged
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Paged -> Paged -> Bool
== :: Paged -> Paged -> Bool
$c/= :: Paged -> Paged -> Bool
/= :: Paged -> Paged -> Bool
Eq, Eq Paged
Eq Paged =>
(Paged -> Paged -> Ordering)
-> (Paged -> Paged -> Bool)
-> (Paged -> Paged -> Bool)
-> (Paged -> Paged -> Bool)
-> (Paged -> Paged -> Bool)
-> (Paged -> Paged -> Paged)
-> (Paged -> Paged -> Paged)
-> Ord Paged
Paged -> Paged -> Bool
Paged -> Paged -> Ordering
Paged -> Paged -> Paged
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Paged -> Paged -> Ordering
compare :: Paged -> Paged -> Ordering
$c< :: Paged -> Paged -> Bool
< :: Paged -> Paged -> Bool
$c<= :: Paged -> Paged -> Bool
<= :: Paged -> Paged -> Bool
$c> :: Paged -> Paged -> Bool
> :: Paged -> Paged -> Bool
$c>= :: Paged -> Paged -> Bool
>= :: Paged -> Paged -> Bool
$cmax :: Paged -> Paged -> Paged
max :: Paged -> Paged -> Paged
$cmin :: Paged -> Paged -> Paged
min :: Paged -> Paged -> Paged
Ord, Int -> Paged -> ShowS
[Paged] -> ShowS
Paged -> String
(Int -> Paged -> ShowS)
-> (Paged -> String) -> ([Paged] -> ShowS) -> Show Paged
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Paged -> ShowS
showsPrec :: Int -> Paged -> ShowS
$cshow :: Paged -> String
show :: Paged -> String
$cshowList :: [Paged] -> ShowS
showList :: [Paged] -> ShowS
Show)
maxPageSize :: Int
maxPageSize :: Int
maxPageSize = Int
100
instance Default Paged where
def :: Paged
def = Int -> Int -> Paged
Paged Int
maxPageSize Int
1
page :: Int -> Paged
page :: Int -> Paged
page Int
n | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1 = Paged
forall a. Default a => a
def { pageNumber = n }
page Int
_ = String -> Paged
forall a. HasCallStack => String -> a
error String
"Page number not in range [1..]"
paged :: Int -> Int -> Paged
paged :: Int -> Int -> Paged
paged Int
size Int
_ | Int
size Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
maxPageSize = String -> Paged
forall a. HasCallStack => String -> a
error String
"Page size exceeds 100"
paged Int
_ Int
n | Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 = String -> Paged
forall a. HasCallStack => String -> a
error String
"Page number not in range [1..]"
paged Int
size Int
n = Int -> Int -> Paged
Paged Int
size Int
n
nextPage :: Paged -> Paged
nextPage :: Paged -> Paged
nextPage Paged
p = Paged
p { pageNumber = 1 + pageNumber p }
data
type PaginationExpanded subApi =
QueryParam "count" Int
:> QueryParam "page" Int
:> subApi