{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Yesod.Paginator.Paginate
( paginate
, paginate'
, selectPaginated
, selectPaginated'
, getCurrentPage
)
where
import Yesod.Paginator.Prelude
import Control.Monad.Trans.Reader (ReaderT)
import Database.Persist
import Yesod.Core
import Yesod.Paginator.Pages
paginate :: MonadHandler m => PerPage -> [a] -> m (Pages a)
paginate per items = paginate' per items <$> getCurrentPage
paginate' :: PerPage -> [a] -> PageNumber -> Pages a
paginate' per items p =
toPages p per (genericLength items) $ genericTake per $ genericDrop
(pageOffset p per)
items
selectPaginated
:: ( MonadHandler m
, PersistEntity record
, PersistEntityBackend record ~ BaseBackend backend
, PersistQueryRead backend
)
=> PerPage
-> [Filter record]
-> [SelectOpt record]
-> ReaderT backend m (Pages (Entity record))
selectPaginated per filters options =
selectPaginated' per filters options =<< lift getCurrentPage
selectPaginated'
:: ( MonadIO m
, PersistEntity record
, PersistEntityBackend record ~ BaseBackend backend
, PersistQueryRead backend
)
=> PerPage
-> [Filter record]
-> [SelectOpt record]
-> PageNumber
-> ReaderT backend m (Pages (Entity record))
selectPaginated' per filters options p =
toPages p per <$> (fromIntegral <$> count filters) <*> selectList
filters
(options
<> [ OffsetBy $ fromIntegral $ pageOffset p per
, LimitTo $ fromIntegral per
]
)
getCurrentPage :: MonadHandler m => m PageNumber
getCurrentPage = fromMaybe 1 . go <$> lookupGetParam "p"
where
go :: Maybe Text -> Maybe PageNumber
go mp = readIntegral . unpack =<< mp