{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Hakyll.Core.Identifier
( Identifier
, fromFilePath
, toFilePath
, identifierVersion
, setVersion
) where
import Control.DeepSeq (NFData (..))
import Data.List (intercalate)
import System.FilePath (dropTrailingPathSeparator, splitPath,
pathSeparator)
import Data.Binary (Binary (..))
import Data.Typeable (Typeable)
import GHC.Exts (IsString, fromString)
data Identifier = Identifier
{ identifierVersion :: Maybe String
, identifierPath :: String
} deriving (Eq, Ord, Typeable)
instance Binary Identifier where
put (Identifier v p) = put v >> put p
get = Identifier <$> get <*> get
instance IsString Identifier where
fromString = fromFilePath
instance NFData Identifier where
rnf (Identifier v p) = rnf v `seq` rnf p `seq` ()
instance Show Identifier where
show i = case identifierVersion i of
Nothing -> toFilePath i
Just v -> toFilePath i ++ " (" ++ v ++ ")"
fromFilePath :: FilePath -> Identifier
fromFilePath = Identifier Nothing .
intercalate "/" . filter (not . null) . split'
where
split' = map dropTrailingPathSeparator . splitPath
toFilePath :: Identifier -> FilePath
toFilePath = intercalate [pathSeparator] . split' . identifierPath
where
split' = map dropTrailingPathSeparator . splitPath
setVersion :: Maybe String -> Identifier -> Identifier
setVersion v i = i {identifierVersion = v}