module Hakyll.Core.Identifier
( Identifier (..)
, parseIdentifier
, toFilePath
, setGroup
) where
import Control.Arrow (second)
import Control.Applicative ((<$>), (<*>))
import Control.Monad (mplus)
import Data.Monoid (Monoid, mempty, mappend)
import Data.List (intercalate)
import Data.Binary (Binary, get, put)
import GHC.Exts (IsString, fromString)
import Data.Typeable (Typeable)
data Identifier = Identifier
{ identifierGroup :: Maybe String
, identifierPath :: String
} deriving (Eq, Ord, Typeable)
instance Monoid Identifier where
mempty = Identifier Nothing ""
Identifier g1 p1 `mappend` Identifier g2 p2 =
Identifier (g1 `mplus` g2) (p1 `mappend` p2)
instance Binary Identifier where
put (Identifier g p) = put g >> put p
get = Identifier <$> get <*> get
instance Show Identifier where
show i@(Identifier Nothing _) = toFilePath i
show i@(Identifier (Just g) _) = toFilePath i ++ " (" ++ g ++ ")"
instance IsString Identifier where
fromString = parseIdentifier
parseIdentifier :: String -> Identifier
parseIdentifier = Identifier Nothing
. intercalate "/" . filter (not . null) . split'
where
split' [] = [[]]
split' str = let (pre, post) = second (drop 1) $ break (== '/') str
in pre : split' post
toFilePath :: Identifier -> FilePath
toFilePath = identifierPath
setGroup :: Maybe String -> Identifier -> Identifier
setGroup g (Identifier _ p) = Identifier g p