module Yesod.Paginate
( Paginate (..)
, PaginateRoute (..)
, defaultPaginate
, prevLink
, nextLink
)
where
import Yesod
import Control.Applicative
import Language.Haskell.TH.Syntax
data Paginate master a = Paginate
{ pgnDefaultCount :: Int
, pgnGetItems :: Int -> Int -> GHandler (Paginate master a) master [a]
, pgnItemCount :: GHandler (Paginate master a) master Int
, pgnDisplayItems :: Int -> Int -> [a] -> GHandler (Paginate master a) master RepHtml
}
mkYesodSub
"Paginate master a"
[ ClassP ''Yesod [VarT $ mkName "master"]
]
#if GHC7
[parseRoutes|
#else
[$parseRoutes|
#endif
/ PaginateHomeR GET
/#Int PaginateStartR GET
/#Int/#Int PaginateR GET
|]
getPaginateHomeR :: GHandler (Paginate master a) master RepHtml
getPaginateHomeR = do
pgn <- getYesodSub
toMaster <- getRouteToMaster
redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) 0))
getPaginateStartR :: Int -> GHandler (Paginate master a) master RepHtml
getPaginateStartR start = do
pgn <- getYesodSub
toMaster <- getRouteToMaster
redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) start))
getPaginateR :: Int -> Int -> GHandler (Paginate master a) master RepHtml
getPaginateR howmany start = do
pgn <- getYesodSub
xs <- pgnGetItems pgn howmany start
pgnDisplayItems pgn howmany start xs
defaultPaginate
:: (YesodPersist master, PersistBackend (YesodDB master (GHandler (Paginate master a) master)), PersistEntity a)
=> Int
-> [Filter a]
-> [Order a]
-> (Int -> Int -> [a] -> GHandler (Paginate master a) master RepHtml)
-> Paginate master a
defaultPaginate x fs os d = Paginate
{ pgnDefaultCount = x
, pgnGetItems = \y z -> map snd <$> runDB (selectList fs os y z)
, pgnItemCount = runDB (count fs)
, pgnDisplayItems = d
}
prevLink :: Paginate master a -> Int -> Int -> Maybe (Route (Paginate master a))
prevLink p howmany start
| start > 0 = Just (PaginateR howmany (max 0 (starthowmany)))
| otherwise = Nothing
nextLink :: Paginate master a -> Int -> Int -> GHandler (Paginate master a) master (Maybe (Route (Paginate master a)))
nextLink p howmany start = go <$> pgnItemCount p where
go l | start < lhowmany1 = Just (PaginateR howmany (start+howmany))
| otherwise = Nothing