module Rules.Blog.Paginate.Utils (
    grouper
  , makeId
  , title
) where

import           Control.Monad.Reader (asks)
import           Hakyll

import           Config.Blog          (BlogConfig (..))
import           Rules.Blog.Type
import           Utils                (makePageIdentifier)

grouper :: (Monad m, MonadMetadata f, MonadFail f)
    => BlogConfReader n m ([Identifier] -> f [[Identifier]])
grouper :: forall (m :: * -> *) (f :: * -> *) (n :: * -> *).
(Monad m, MonadMetadata f, MonadFail f) =>
BlogConfReader n m ([Identifier] -> f [[Identifier]])
grouper = (BlogConfig n -> [Identifier] -> f [[Identifier]])
-> ReaderT (BlogConfig n) m ([Identifier] -> f [[Identifier]])
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ((BlogConfig n -> [Identifier] -> f [[Identifier]])
 -> ReaderT (BlogConfig n) m ([Identifier] -> f [[Identifier]]))
-> (BlogConfig n -> [Identifier] -> f [[Identifier]])
-> ReaderT (BlogConfig n) m ([Identifier] -> f [[Identifier]])
forall a b. (a -> b) -> a -> b
$
    ((f [Identifier] -> f [[Identifier]])
 -> ([Identifier] -> f [Identifier])
 -> [Identifier]
 -> f [[Identifier]])
-> ([Identifier] -> f [Identifier])
-> (f [Identifier] -> f [[Identifier]])
-> [Identifier]
-> f [[Identifier]]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (f [Identifier] -> f [[Identifier]])
-> ([Identifier] -> f [Identifier])
-> [Identifier]
-> f [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) [Identifier] -> f [Identifier]
forall (m :: * -> *).
(MonadMetadata m, MonadFail m) =>
[Identifier] -> m [Identifier]
sortRecentFirst ((f [Identifier] -> f [[Identifier]])
 -> [Identifier] -> f [[Identifier]])
-> (BlogConfig n -> f [Identifier] -> f [[Identifier]])
-> BlogConfig n
-> [Identifier]
-> f [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Identifier] -> [[Identifier]])
-> f [Identifier] -> f [[Identifier]]
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Identifier] -> [[Identifier]])
 -> f [Identifier] -> f [[Identifier]])
-> (BlogConfig n -> [Identifier] -> [[Identifier]])
-> BlogConfig n
-> f [Identifier]
-> f [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Identifier] -> [[Identifier]]
forall a. Int -> [a] -> [[a]]
paginateEvery (Int -> [Identifier] -> [[Identifier]])
-> (BlogConfig n -> Int)
-> BlogConfig n
-> [Identifier]
-> [[Identifier]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BlogConfig n -> Int
forall (m :: * -> *). BlogConfig m -> Int
blogPageEntriesNum

makeId :: Monad n
    => (BlogConfig m -> a -> FilePath)
    -> BlogConfReader m n (a -> PageNumber -> Identifier)
makeId :: forall (n :: * -> *) (m :: * -> *) a.
Monad n =>
(BlogConfig m -> a -> FilePath)
-> BlogConfReader m n (a -> Int -> Identifier)
makeId = ((a -> FilePath) -> a -> Int -> Identifier)
-> ReaderT (BlogConfig m) n (a -> FilePath)
-> ReaderT (BlogConfig m) n (a -> Int -> Identifier)
forall a b.
(a -> b)
-> ReaderT (BlogConfig m) n a -> ReaderT (BlogConfig m) n b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (FilePath -> Int -> Identifier
makePageIdentifier (FilePath -> Int -> Identifier)
-> (a -> FilePath) -> a -> Int -> Identifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) (ReaderT (BlogConfig m) n (a -> FilePath)
 -> ReaderT (BlogConfig m) n (a -> Int -> Identifier))
-> ((BlogConfig m -> a -> FilePath)
    -> ReaderT (BlogConfig m) n (a -> FilePath))
-> (BlogConfig m -> a -> FilePath)
-> ReaderT (BlogConfig m) n (a -> Int -> Identifier)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BlogConfig m -> a -> FilePath)
-> ReaderT (BlogConfig m) n (a -> FilePath)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks

title :: String
    -> String
    -> String
title :: FilePath -> FilePath -> FilePath
title FilePath
s FilePath
tag = [FilePath] -> FilePath
unwords [FilePath
s, FilePath
"posts:", FilePath
tag]