{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
module Database.Persist.Pagination.Types where
import Control.Applicative (Alternative(..))
import Database.Persist.Sql (Entity)
newtype PageSize = PageSize { unPageSize :: Int }
deriving (Eq, Show)
data SortOrder = Ascend | Descend
deriving (Eq, Show)
data Range t = Range { rangeMin :: t, rangeMax :: t }
deriving (Eq, Show, Functor, Foldable, Traversable)
instance Ord t => Semigroup (Range t) where
Range l h <> Range l' h' = Range (min l l') (max h h')
instance (Bounded t, Ord t) => Monoid (Range t) where
mempty = Range minBound maxBound
mappend = (<>)
type DesiredRange t = Range (Maybe t)
bumpPageRange
:: Ord typ
=> SortOrder
-> DesiredRange typ
-> Range typ
-> DesiredRange typ
bumpPageRange sortOrder (Range mmin mmax) (Range min' max') =
case sortOrder of
Ascend ->
Range (mmin `max` Just max') mmax
Descend ->
Range mmin (Just min' <|> (Just min' `min` mmax))