module Yesod.Paginate
( Paginate (..)
, PaginateRoute (..)
, defaultPaginate
, prevLink
, nextLink
)
where
import Yesod
import Control.Applicative
import Language.Haskell.TH.Syntax
data Paginate master rep a = Paginate
{ pgnDefaultCount :: Int
, pgnGetItems :: Int -> Int -> GHandler (Paginate master rep a) master [a]
, pgnItemCount :: GHandler (Paginate master rep a) master Int
, pgnDisplayItems :: Int -> Int -> [a] -> GHandler (Paginate master rep a) master rep
}
mkYesodSub
"Paginate master rep a"
[ ClassP ''Yesod [VarT $ mkName "master"]
, ClassP ''HasReps [VarT $ mkName "rep"]
]
#if GHC7
[parseRoutes|
#else
[$parseRoutes|
#endif
/ PaginateHomeR GET
/#Int PaginateStartR GET
/#Int/#Int PaginateR GET
|]
getPaginateHomeR :: GHandler (Paginate master rep a) master rep
getPaginateHomeR = do
pgn <- getYesodSub
toMaster <- getRouteToMaster
redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) 0))
getPaginateStartR :: Int -> GHandler (Paginate master rep a) master rep
getPaginateStartR start = do
pgn <- getYesodSub
toMaster <- getRouteToMaster
redirect RedirectSeeOther (toMaster (PaginateR (pgnDefaultCount pgn) start))
getPaginateR :: Int -> Int -> GHandler (Paginate master rep a) master rep
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 rep a) master)), PersistEntity a)
=> Int
-> [Filter a]
-> [Order a]
-> (Int -> Int -> [a] -> GHandler (Paginate master rep a) master rep)
-> Paginate master rep 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 rep a -> Int -> Int -> Maybe (Route (Paginate master rep a))
prevLink p howmany start
| start > 0 = Just (PaginateR howmany (max 0 (starthowmany)))
| otherwise = Nothing
nextLink :: Paginate master rep a -> Int -> Int -> GHandler (Paginate master rep a) master (Maybe (Route (Paginate master rep a)))
nextLink p howmany start = go <$> pgnItemCount p where
go l | start < lhowmany1 = Just (PaginateR howmany (start+howmany))
| otherwise = Nothing