module Rules.Blog.Index (
    build
) where

import           Control.Monad.Reader (asks, lift)
import           Hakyll
import           System.FilePath      ((</>))

import           Config.Blog          (BlogConfig (..))
import           Rules.Blog.ListPage
import           Rules.Blog.Type
import           Utils                (makePageIdentifier)
import qualified Vendor.FontAwesome   as FA

build :: FA.FontAwesomeIcons
    -> Tags
    -> ListPageOpts
    -> BlogConfReader m Rules ()
build :: forall (m :: * -> *).
FontAwesomeIcons
-> Tags -> ListPageOpts -> BlogConfReader m Rules ()
build FontAwesomeIcons
faIcons Tags
tags ListPageOpts
opts = do
    PageNumber -> Identifier
makeId <- (BlogConfig m -> PageNumber -> Identifier)
-> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ((BlogConfig m -> PageNumber -> Identifier)
 -> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier))
-> (BlogConfig m -> PageNumber -> Identifier)
-> ReaderT (BlogConfig m) Rules (PageNumber -> Identifier)
forall a b. (a -> b) -> a -> b
$ FilePath -> PageNumber -> Identifier
makePageIdentifier (FilePath -> PageNumber -> Identifier)
-> (BlogConfig m -> FilePath)
-> BlogConfig m
-> PageNumber
-> Identifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FilePath -> FilePath -> FilePath
</> FilePath
"index.html") (FilePath -> FilePath)
-> (BlogConfig m -> FilePath) -> BlogConfig m -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BlogConfig m -> FilePath
forall (m :: * -> *). BlogConfig m -> FilePath
blogName
    Rules [Identifier] -> Rules [[Identifier]]
f <- (BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]])
-> ReaderT
     (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]])
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ((BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]])
 -> ReaderT
      (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]]))
-> (BlogConfig m -> Rules [Identifier] -> Rules [[Identifier]])
-> ReaderT
     (BlogConfig m) Rules (Rules [Identifier] -> Rules [[Identifier]])
forall a b. (a -> b) -> a -> b
$ ([Identifier] -> [[Identifier]])
-> Rules [Identifier] -> Rules [[Identifier]]
forall a b. (a -> b) -> Rules a -> Rules b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Identifier] -> [[Identifier]])
 -> Rules [Identifier] -> Rules [[Identifier]])
-> (BlogConfig m -> [Identifier] -> [[Identifier]])
-> BlogConfig m
-> Rules [Identifier]
-> Rules [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PageNumber -> [Identifier] -> [[Identifier]]
forall a. PageNumber -> [a] -> [[a]]
paginateEvery (PageNumber -> [Identifier] -> [[Identifier]])
-> (BlogConfig m -> PageNumber)
-> BlogConfig m
-> [Identifier]
-> [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BlogConfig m -> PageNumber
forall (m :: * -> *). BlogConfig m -> PageNumber
blogPageEntriesNum
    Pattern
ep <- (BlogConfig m -> Pattern) -> ReaderT (BlogConfig m) Rules Pattern
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks BlogConfig m -> Pattern
forall (m :: * -> *). BlogConfig m -> Pattern
blogEntryPattern
    Rules () -> BlogConfReader m Rules ()
forall (m :: * -> *) a.
Monad m =>
m a -> ReaderT (BlogConfig m) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Rules () -> BlogConfReader m Rules ())
-> Rules () -> BlogConfReader m Rules ()
forall a b. (a -> b) -> a -> b
$ Maybe FilePath
-> FontAwesomeIcons -> Tags -> ListPageOpts -> Paginate -> Rules ()
listPage Maybe FilePath
forall a. Maybe a
Nothing FontAwesomeIcons
faIcons Tags
tags ListPageOpts
opts (Paginate -> Rules ()) -> Rules Paginate -> Rules ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
        ([Identifier] -> Rules [[Identifier]])
-> Pattern -> (PageNumber -> Identifier) -> Rules Paginate
forall (m :: * -> *).
MonadMetadata m =>
([Identifier] -> m [[Identifier]])
-> Pattern -> (PageNumber -> Identifier) -> m Paginate
buildPaginateWith (Rules [Identifier] -> Rules [[Identifier]]
f (Rules [Identifier] -> Rules [[Identifier]])
-> ([Identifier] -> Rules [Identifier])
-> [Identifier]
-> Rules [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Identifier] -> Rules [Identifier]
forall (m :: * -> *).
(MonadMetadata m, MonadFail m) =>
[Identifier] -> m [Identifier]
sortRecentFirst) Pattern
ep PageNumber -> Identifier
makeId