content: {-# language OverloadedStrings #-}
  module SitePipe.Utilities
    ( addPrefix
    , setExt
    , getTags
    ) where
  
  import System.FilePath.Posix
  import Data.Aeson
  import Data.Aeson.Lens
  import qualified Data.Map as M
  import qualified Data.Text as T
  import Control.Lens hiding ((.=))
  
  -- | Set the extension of a filepath or url to the given extension.
  -- Use @setExt ""@ to remove any extension.
  setExt :: String -> FilePath -> FilePath
  setExt = flip replaceExtension
  
  -- | Add a prefix to a filepath or url
  addPrefix :: String -> FilePath -> FilePath
  addPrefix = (++)
  
  -- | Given a function which creates a url from a tag name and a list of posts
  -- (which have a tags property which is a list of strings)
  -- this returns a list of tags which contain:
  --
  -- * name: The tag name
  -- * url: The tag's url
  -- * posts: The list of posts matching that tag
  getTags :: (String -> String) -- ^ Accept a tagname and create a url
             -> [Value] -- ^ List of posts
             -> [Value]
  getTags makeUrl postList = uncurry (makeTag makeUrl) <$> M.toList tagMap
    where
      tagMap = M.unionsWith mappend (toMap <$> postList)
      toMap post = M.fromList (zip (post ^.. key "tags" . values . _String . to T.unpack) $ repeat [post])
  
  -- | Makes a single tag
  makeTag :: (String -> String) -> String -> [Value] -> Value
  makeTag makeUrl tagname posts = object
    [ "tag" .= tagname
    , "url" .= makeUrl tagname
    , "posts" .= posts
    ]
  