module Contexts.Utils (
    metadataToListField
) where

import           Data.Functor    ((<&>))
import           Data.String     (fromString)
import           Hakyll
import           System.FilePath ((</>))

metadataToListField :: String -> String -> Context String
metadataToListField :: String -> String -> Context String
metadataToListField String
mdName String
mdKey = String
-> Context String
-> (Item String -> Compiler [Item String])
-> Context String
forall a b.
String -> Context a -> (Item b -> Compiler [Item a]) -> Context b
listFieldWith String
mdName Context String
ctx ((Item String -> Compiler [Item String]) -> Context String)
-> (Item String -> Compiler [Item String]) -> Context String
forall a b. (a -> b) -> a -> b
$ \Item String
item ->
    Identifier -> String -> Compiler (Maybe String)
forall (m :: * -> *).
MonadMetadata m =>
Identifier -> String -> m (Maybe String)
getMetadataField (Item String -> Identifier
forall a. Item a -> Identifier
itemIdentifier Item String
item) String
mdName Compiler (Maybe String)
-> (Maybe String -> [Item String]) -> Compiler [Item String]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&>
        [Item String]
-> (String -> [Item String]) -> Maybe String -> [Item String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((String -> Item String) -> [String] -> [Item String]
forall a b. (a -> b) -> [a] -> [b]
map (Item String -> String -> Item String
forall {a}. Item a -> String -> Item String
itemize Item String
item (String -> Item String)
-> (String -> String) -> String -> Item String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
trim) ([String] -> [Item String])
-> (String -> [String]) -> String -> [Item String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> [String]
splitAll String
",")
    where
        ctx :: Context String
ctx = String -> (Item String -> Compiler String) -> Context String
forall a. String -> (Item a -> Compiler String) -> Context a
field String
mdKey (String -> Compiler String
forall a. a -> Compiler a
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> Compiler String)
-> (Item String -> String) -> Item String -> Compiler String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Item String -> String
forall a. Item a -> a
itemBody) Context String -> Context String -> Context String
forall a. Semigroup a => a -> a -> a
<> Context String
defaultContext
        itemize :: Item a -> String -> Item String
itemize Item a
item String
md = Item {
            itemIdentifier :: Identifier
itemIdentifier = String -> Identifier
forall a. IsString a => String -> a
fromString (String
md String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
md)
          , itemBody :: String
itemBody = Identifier -> String
toFilePath (Item a -> Identifier
forall a. Item a -> Identifier
itemIdentifier Item a
item) String -> String -> String
</> String
md
        }