{-# LANGUAGE OverloadedStrings #-}
module Hakyll.Web.Paginate
( PageNumber
, Paginate (..)
, buildPaginateWith
, paginateEvery
, paginateRules
, paginateContext
) where
import Control.Applicative (empty)
import Control.Monad (forM_, forM)
import qualified Data.Map as M
import qualified Data.Set as S
import Hakyll.Core.Compiler
import Hakyll.Core.Identifier
import Hakyll.Core.Identifier.Pattern
import Hakyll.Core.Item
import Hakyll.Core.Metadata
import Hakyll.Core.Rules
import Hakyll.Web.Html
import Hakyll.Web.Template.Context
type PageNumber = Int
data Paginate = Paginate
{ Paginate -> Map PageNumber [Identifier]
paginateMap :: M.Map PageNumber [Identifier]
, Paginate -> PageNumber -> Identifier
paginateMakeId :: PageNumber -> Identifier
, Paginate -> Dependency
paginateDependency :: Dependency
}
paginateNumPages :: Paginate -> Int
paginateNumPages :: Paginate -> PageNumber
paginateNumPages = Map PageNumber [Identifier] -> PageNumber
forall k a. Map k a -> PageNumber
M.size (Map PageNumber [Identifier] -> PageNumber)
-> (Paginate -> Map PageNumber [Identifier])
-> Paginate
-> PageNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Paginate -> Map PageNumber [Identifier]
paginateMap
paginateEvery :: Int -> [a] -> [[a]]
paginateEvery :: forall a. PageNumber -> [a] -> [[a]]
paginateEvery PageNumber
n = [a] -> [[a]]
forall {a}. [a] -> [[a]]
go
where
go :: [a] -> [[a]]
go [] = []
go [a]
xs = let ([a]
y, [a]
ys) = PageNumber -> [a] -> ([a], [a])
forall a. PageNumber -> [a] -> ([a], [a])
splitAt PageNumber
n [a]
xs in [a]
y [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
go [a]
ys
buildPaginateWith
:: MonadMetadata m
=> ([Identifier] -> m [[Identifier]])
-> Pattern
-> (PageNumber -> Identifier)
-> m Paginate
buildPaginateWith :: forall (m :: * -> *).
MonadMetadata m =>
([Identifier] -> m [[Identifier]])
-> Pattern -> (PageNumber -> Identifier) -> m Paginate
buildPaginateWith [Identifier] -> m [[Identifier]]
grouper Pattern
pattern PageNumber -> Identifier
makeId = do
[Identifier]
ids <- Pattern -> m [Identifier]
forall (m :: * -> *). MonadMetadata m => Pattern -> m [Identifier]
getMatches Pattern
pattern
[[Identifier]]
idGroups <- [Identifier] -> m [[Identifier]]
grouper [Identifier]
ids
let idsSet :: Set Identifier
idsSet = [Identifier] -> Set Identifier
forall a. Ord a => [a] -> Set a
S.fromList [Identifier]
ids
Paginate -> m Paginate
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Paginate
{ paginateMap :: Map PageNumber [Identifier]
paginateMap = [(PageNumber, [Identifier])] -> Map PageNumber [Identifier]
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([PageNumber] -> [[Identifier]] -> [(PageNumber, [Identifier])]
forall a b. [a] -> [b] -> [(a, b)]
zip [PageNumber
1 ..] [[Identifier]]
idGroups)
, paginateMakeId :: PageNumber -> Identifier
paginateMakeId = PageNumber -> Identifier
makeId
, paginateDependency :: Dependency
paginateDependency = Pattern -> Set Identifier -> Dependency
PatternDependency Pattern
pattern Set Identifier
idsSet
}
paginateRules :: Paginate -> (PageNumber -> Pattern -> Rules ()) -> Rules ()
paginateRules :: Paginate -> (PageNumber -> Pattern -> Rules ()) -> Rules ()
paginateRules Paginate
paginator PageNumber -> Pattern -> Rules ()
rules =
[(PageNumber, [Identifier])]
-> ((PageNumber, [Identifier]) -> Rules ()) -> Rules ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Map PageNumber [Identifier] -> [(PageNumber, [Identifier])]
forall k a. Map k a -> [(k, a)]
M.toList (Map PageNumber [Identifier] -> [(PageNumber, [Identifier])])
-> Map PageNumber [Identifier] -> [(PageNumber, [Identifier])]
forall a b. (a -> b) -> a -> b
$ Paginate -> Map PageNumber [Identifier]
paginateMap Paginate
paginator) (((PageNumber, [Identifier]) -> Rules ()) -> Rules ())
-> ((PageNumber, [Identifier]) -> Rules ()) -> Rules ()
forall a b. (a -> b) -> a -> b
$ \(PageNumber
idx, [Identifier]
identifiers) ->
[Dependency] -> Rules () -> Rules ()
forall a. [Dependency] -> Rules a -> Rules a
rulesExtraDependencies [Paginate -> Dependency
paginateDependency Paginate
paginator] (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$
[Identifier] -> Rules () -> Rules ()
create [Paginate -> PageNumber -> Identifier
paginateMakeId Paginate
paginator PageNumber
idx] (Rules () -> Rules ()) -> Rules () -> Rules ()
forall a b. (a -> b) -> a -> b
$
PageNumber -> Pattern -> Rules ()
rules PageNumber
idx (Pattern -> Rules ()) -> Pattern -> Rules ()
forall a b. (a -> b) -> a -> b
$ [Identifier] -> Pattern
fromList [Identifier]
identifiers
paginatePage :: Paginate -> PageNumber -> Maybe Identifier
paginatePage :: Paginate -> PageNumber -> Maybe Identifier
paginatePage Paginate
pag PageNumber
pageNumber
| PageNumber
pageNumber PageNumber -> PageNumber -> Bool
forall a. Ord a => a -> a -> Bool
< PageNumber
1 = Maybe Identifier
forall a. Maybe a
Nothing
| PageNumber
pageNumber PageNumber -> PageNumber -> Bool
forall a. Ord a => a -> a -> Bool
> (Paginate -> PageNumber
paginateNumPages Paginate
pag) = Maybe Identifier
forall a. Maybe a
Nothing
| Bool
otherwise = Identifier -> Maybe Identifier
forall a. a -> Maybe a
Just (Identifier -> Maybe Identifier) -> Identifier -> Maybe Identifier
forall a b. (a -> b) -> a -> b
$ Paginate -> PageNumber -> Identifier
paginateMakeId Paginate
pag PageNumber
pageNumber
paginateContext :: Paginate -> PageNumber -> Context a
paginateContext :: forall a. Paginate -> PageNumber -> Context a
paginateContext Paginate
pag PageNumber
currentPage = [Context a] -> Context a
forall a. Monoid a => [a] -> a
mconcat
[ [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"firstPageNum" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
1 Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
num
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"firstPageUrl" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
1 Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
url
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"previousPageNum" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage (PageNumber
currentPage PageNumber -> PageNumber -> PageNumber
forall a. Num a => a -> a -> a
- PageNumber
1) Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
num
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"previousPageUrl" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage (PageNumber
currentPage PageNumber -> PageNumber -> PageNumber
forall a. Num a => a -> a -> a
- PageNumber
1) Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
url
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"nextPageNum" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage (PageNumber
currentPage PageNumber -> PageNumber -> PageNumber
forall a. Num a => a -> a -> a
+ PageNumber
1) Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
num
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"nextPageUrl" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage (PageNumber
currentPage PageNumber -> PageNumber -> PageNumber
forall a. Num a => a -> a -> a
+ PageNumber
1) Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
url
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"lastPageNum" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
lastPage Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
num
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"lastPageUrl" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
_ -> PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
lastPage Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
url
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"currentPageNum" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
i -> Item a -> Compiler (PageNumber, Identifier)
forall {m :: * -> *} {a}.
Monad m =>
Item a -> m (PageNumber, Identifier)
thisPage Item a
i Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
num
, [Char] -> (Item a -> Compiler [Char]) -> Context a
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"currentPageUrl" ((Item a -> Compiler [Char]) -> Context a)
-> (Item a -> Compiler [Char]) -> Context a
forall a b. (a -> b) -> a -> b
$ \Item a
i -> Item a -> Compiler (PageNumber, Identifier)
forall {m :: * -> *} {a}.
Monad m =>
Item a -> m (PageNumber, Identifier)
thisPage Item a
i Compiler (PageNumber, Identifier)
-> ((PageNumber, Identifier) -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (PageNumber, Identifier) -> Compiler [Char]
url
, [Char] -> [Char] -> Context a
forall a. [Char] -> [Char] -> Context a
constField [Char]
"numPages" ([Char] -> Context a) -> [Char] -> Context a
forall a b. (a -> b) -> a -> b
$ PageNumber -> [Char]
forall a. Show a => a -> [Char]
show (PageNumber -> [Char]) -> PageNumber -> [Char]
forall a b. (a -> b) -> a -> b
$ Paginate -> PageNumber
paginateNumPages Paginate
pag
, ([Char] -> [[Char]] -> Item a -> Compiler ContextField)
-> Context a
forall a.
([Char] -> [[Char]] -> Item a -> Compiler ContextField)
-> Context a
Context (([Char] -> [[Char]] -> Item a -> Compiler ContextField)
-> Context a)
-> ([Char] -> [[Char]] -> Item a -> Compiler ContextField)
-> Context a
forall a b. (a -> b) -> a -> b
$ \[Char]
k [[Char]]
_ Item a
i -> case [Char]
k of
[Char]
"allPages" -> do
let ctx :: Context (PageNumber, Identifier)
ctx =
[Char]
-> (Item (PageNumber, Identifier) -> Compiler [Char])
-> Context (PageNumber, Identifier)
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"isCurrent" (\Item (PageNumber, Identifier)
n -> if (PageNumber, Identifier) -> PageNumber
forall a b. (a, b) -> a
fst (Item (PageNumber, Identifier) -> (PageNumber, Identifier)
forall a. Item a -> a
itemBody Item (PageNumber, Identifier)
n) PageNumber -> PageNumber -> Bool
forall a. Eq a => a -> a -> Bool
== PageNumber
currentPage then [Char] -> Compiler [Char]
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
"true" else Compiler [Char]
forall a. Compiler a
forall (f :: * -> *) a. Alternative f => f a
empty) Context (PageNumber, Identifier)
-> Context (PageNumber, Identifier)
-> Context (PageNumber, Identifier)
forall a. Monoid a => a -> a -> a
`mappend`
[Char]
-> (Item (PageNumber, Identifier) -> Compiler [Char])
-> Context (PageNumber, Identifier)
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"num" ((PageNumber, Identifier) -> Compiler [Char]
num ((PageNumber, Identifier) -> Compiler [Char])
-> (Item (PageNumber, Identifier) -> (PageNumber, Identifier))
-> Item (PageNumber, Identifier)
-> Compiler [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Item (PageNumber, Identifier) -> (PageNumber, Identifier)
forall a. Item a -> a
itemBody) Context (PageNumber, Identifier)
-> Context (PageNumber, Identifier)
-> Context (PageNumber, Identifier)
forall a. Monoid a => a -> a -> a
`mappend`
[Char]
-> (Item (PageNumber, Identifier) -> Compiler [Char])
-> Context (PageNumber, Identifier)
forall a. [Char] -> (Item a -> Compiler [Char]) -> Context a
field [Char]
"url" ((PageNumber, Identifier) -> Compiler [Char]
url ((PageNumber, Identifier) -> Compiler [Char])
-> (Item (PageNumber, Identifier) -> (PageNumber, Identifier))
-> Item (PageNumber, Identifier)
-> Compiler [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Item (PageNumber, Identifier) -> (PageNumber, Identifier)
forall a. Item a -> a
itemBody)
[(PageNumber, Identifier)]
list <- [PageNumber]
-> (PageNumber -> Compiler (PageNumber, Identifier))
-> Compiler [(PageNumber, Identifier)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [PageNumber
1 .. PageNumber
lastPage] ((PageNumber -> Compiler (PageNumber, Identifier))
-> Compiler [(PageNumber, Identifier)])
-> (PageNumber -> Compiler (PageNumber, Identifier))
-> Compiler [(PageNumber, Identifier)]
forall a b. (a -> b) -> a -> b
$
\PageNumber
n -> if PageNumber
n PageNumber -> PageNumber -> Bool
forall a. Eq a => a -> a -> Bool
== PageNumber
currentPage then Item a -> Compiler (PageNumber, Identifier)
forall {m :: * -> *} {a}.
Monad m =>
Item a -> m (PageNumber, Identifier)
thisPage Item a
i else PageNumber -> Compiler (PageNumber, Identifier)
forall {m :: * -> *}.
MonadFail m =>
PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
n
[Item (PageNumber, Identifier)]
items <- ((PageNumber, Identifier)
-> Compiler (Item (PageNumber, Identifier)))
-> [(PageNumber, Identifier)]
-> Compiler [Item (PageNumber, Identifier)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (PageNumber, Identifier)
-> Compiler (Item (PageNumber, Identifier))
forall a. a -> Compiler (Item a)
makeItem [(PageNumber, Identifier)]
list
ContextField -> Compiler ContextField
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return (ContextField -> Compiler ContextField)
-> ContextField -> Compiler ContextField
forall a b. (a -> b) -> a -> b
$ Context (PageNumber, Identifier)
-> [Item (PageNumber, Identifier)] -> ContextField
forall a. Context a -> [Item a] -> ContextField
ListField Context (PageNumber, Identifier)
ctx [Item (PageNumber, Identifier)]
items
[Char]
_ -> do
Compiler ContextField
forall a. Compiler a
forall (f :: * -> *) a. Alternative f => f a
empty
]
where
lastPage :: PageNumber
lastPage = Paginate -> PageNumber
paginateNumPages Paginate
pag
thisPage :: Item a -> m (PageNumber, Identifier)
thisPage Item a
i = (PageNumber, Identifier) -> m (PageNumber, Identifier)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (PageNumber
currentPage, Item a -> Identifier
forall a. Item a -> Identifier
itemIdentifier Item a
i)
otherPage :: PageNumber -> m (PageNumber, Identifier)
otherPage PageNumber
n
| PageNumber
n PageNumber -> PageNumber -> Bool
forall a. Eq a => a -> a -> Bool
== PageNumber
currentPage = [Char] -> m (PageNumber, Identifier)
forall a. [Char] -> m a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> m (PageNumber, Identifier))
-> [Char] -> m (PageNumber, Identifier)
forall a b. (a -> b) -> a -> b
$ [Char]
"This is the current page: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ PageNumber -> [Char]
forall a. Show a => a -> [Char]
show PageNumber
n
| Bool
otherwise = case Paginate -> PageNumber -> Maybe Identifier
paginatePage Paginate
pag PageNumber
n of
Maybe Identifier
Nothing -> [Char] -> m (PageNumber, Identifier)
forall a. [Char] -> m a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> m (PageNumber, Identifier))
-> [Char] -> m (PageNumber, Identifier)
forall a b. (a -> b) -> a -> b
$ [Char]
"No such page: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ PageNumber -> [Char]
forall a. Show a => a -> [Char]
show PageNumber
n
Just Identifier
i -> (PageNumber, Identifier) -> m (PageNumber, Identifier)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (PageNumber
n, Identifier
i)
num :: (Int, Identifier) -> Compiler String
num :: (PageNumber, Identifier) -> Compiler [Char]
num = [Char] -> Compiler [Char]
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Char] -> Compiler [Char])
-> ((PageNumber, Identifier) -> [Char])
-> (PageNumber, Identifier)
-> Compiler [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PageNumber -> [Char]
forall a. Show a => a -> [Char]
show (PageNumber -> [Char])
-> ((PageNumber, Identifier) -> PageNumber)
-> (PageNumber, Identifier)
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PageNumber, Identifier) -> PageNumber
forall a b. (a, b) -> a
fst
url :: (Int, Identifier) -> Compiler String
url :: (PageNumber, Identifier) -> Compiler [Char]
url (PageNumber
n, Identifier
i) = Identifier -> Compiler (Maybe [Char])
getRoute Identifier
i Compiler (Maybe [Char])
-> (Maybe [Char] -> Compiler [Char]) -> Compiler [Char]
forall a b. Compiler a -> (a -> Compiler b) -> Compiler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Maybe [Char]
mbR -> case Maybe [Char]
mbR of
Just [Char]
r -> [Char] -> Compiler [Char]
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return ([Char] -> Compiler [Char]) -> [Char] -> Compiler [Char]
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char]
toUrl [Char]
r
Maybe [Char]
Nothing -> [Char] -> Compiler [Char]
forall a. [Char] -> Compiler a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Compiler [Char]) -> [Char] -> Compiler [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"No URL for page: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ PageNumber -> [Char]
forall a. Show a => a -> [Char]
show PageNumber
n