module Rules.Blog.Utils ( appendFooter ) where import Control.Monad.Except (MonadError (..)) import Data.Binary (Binary) import Data.Time.Format (TimeLocale, formatTime) import Data.Time.LocalTime (TimeZone, utcToLocalTime) import Data.Typeable (Typeable) import Hakyll appendFooter :: (Binary a, Typeable a, Semigroup a) => String -> TimeLocale -> TimeZone -> Item a -> Compiler (Item a) String blogName TimeLocale locale TimeZone zone Item a item = do Maybe UTCTime utc <- (UTCTime -> Maybe UTCTime) -> Compiler UTCTime -> Compiler (Maybe UTCTime) forall a b. (a -> b) -> Compiler a -> Compiler b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap UTCTime -> Maybe UTCTime forall a. a -> Maybe a Just (TimeLocale -> Identifier -> Compiler UTCTime forall (m :: * -> *). (MonadMetadata m, MonadFail m) => TimeLocale -> Identifier -> m UTCTime getItemUTC TimeLocale locale (Item a -> Identifier forall a. Item a -> Identifier itemIdentifier Item a item)) Compiler (Maybe UTCTime) -> ([String] -> Compiler (Maybe UTCTime)) -> Compiler (Maybe UTCTime) forall a. Compiler a -> ([String] -> Compiler a) -> Compiler a forall e (m :: * -> *) a. MonadError e m => m a -> (e -> m a) -> m a `catchError` Compiler (Maybe UTCTime) -> [String] -> Compiler (Maybe UTCTime) forall a b. a -> b -> a const (Maybe UTCTime -> Compiler (Maybe UTCTime) forall a. a -> Compiler a forall (m :: * -> *) a. Monad m => a -> m a return Maybe UTCTime forall a. Maybe a Nothing) Maybe String -> Item a -> Compiler (Item a) forall {b}. (Binary b, Typeable b, Semigroup b) => Maybe String -> Item b -> Compiler (Item b) appendFooterWith ((UTCTime -> String) -> Maybe UTCTime -> Maybe String forall a b. (a -> b) -> Maybe a -> Maybe b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (TimeLocale -> String -> LocalTime -> String forall t. FormatTime t => TimeLocale -> String -> t -> String formatTime TimeLocale locale String "%Y" (LocalTime -> String) -> (UTCTime -> LocalTime) -> UTCTime -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . TimeZone -> UTCTime -> LocalTime utcToLocalTime TimeZone zone) Maybe UTCTime utc) Item a item where appendFooterWith :: Maybe String -> Item b -> Compiler (Item b) appendFooterWith Maybe String y Item b item' = do b footer <- Identifier -> Compiler b forall a. (Binary a, Typeable a) => Identifier -> Compiler a loadBody (Identifier -> Compiler b) -> Identifier -> Compiler b forall a b. (a -> b) -> a -> b $ Maybe String -> Identifier -> Identifier setVersion Maybe String y (Identifier -> Identifier) -> Identifier -> Identifier forall a b. (a -> b) -> a -> b $ String -> Identifier fromFilePath (String blogName String -> String -> String forall a. Semigroup a => a -> a -> a <> String "-footer.html") (b -> Compiler b) -> Item b -> Compiler (Item b) forall a b. (a -> Compiler b) -> Item a -> Compiler (Item b) withItemBody (b -> Compiler b forall a. a -> Compiler a forall (m :: * -> *) a. Monad m => a -> m a return (b -> Compiler b) -> (b -> b) -> b -> Compiler b forall b c a. (b -> c) -> (a -> b) -> a -> c . (b -> b -> b forall a. Semigroup a => a -> a -> a <> b footer)) Item b item'