@@ -36,30 +36,36 @@ module Hakyll.Core.Identifier
3636 , fromFilePath
3737 , toFilePath
3838 , castIdentifier
39+ , identifierVersion
40+ , setVersion
3941 ) where
4042
4143
4244--------------------------------------------------------------------------------
43−import Control.DeepSeq (NFData)
44−import Data.List (intercalate)
45−import System.FilePath (dropTrailingPathSeparator, splitPath)
45+import Control.Applicative ((<$>), (<*>))
46+import Control.DeepSeq (NFData (..))
47+import Data.List (intercalate)
48+import System.FilePath (dropTrailingPathSeparator, splitPath)
4649
4750
4851--------------------------------------------------------------------------------
49−import Data.Binary (Binary)
50−import Data.Typeable (Typeable)
51−import GHC.Exts (IsString, fromString)
52+import Data.Binary (Binary (..))
53+import Data.Typeable (Typeable)
54+import GHC.Exts (IsString, fromString)
5255
5356
5457--------------------------------------------------------------------------------
5558-- | An identifier used to uniquely identify a value
56−newtype Identifier a = Identifier {unIdentifier :: String}
57− deriving (Binary, Eq, NFData, Ord, Typeable)
59+data Identifier a = Identifier
60+ { identifierVersion :: Maybe String
61+ , identifierPath :: String
62+ } deriving (Eq, Ord, Typeable)
5863
5964
6065--------------------------------------------------------------------------------
61−instance Show (Identifier a) where
62− show = toFilePath
66+instance Binary (Identifier a) where
67+ put (Identifier v p) = put v >> put p
68+ get = Identifier <$> get <*> get
6369
6470
6571--------------------------------------------------------------------------------
@@ -67,10 +73,23 @@ instance IsString (Identifier a) where
6773 fromString = fromFilePath
6874
6975
76+--------------------------------------------------------------------------------
77+instance NFData (Identifier a) where
78+ rnf (Identifier v p) = rnf v `seq` rnf p `seq` ()
79+
80+
81+--------------------------------------------------------------------------------
82+instance Show (Identifier a) where
83+ show i = case identifierVersion i of
84+ Nothing -> toFilePath i
85+ Just v -> toFilePath i ++ " (" ++ v ++ ")"
86+
87+
7088--------------------------------------------------------------------------------
7189-- | Parse an identifier from a string
7290fromFilePath :: String -> Identifier a
73−fromFilePath = Identifier . intercalate "/" . filter (not . null) . split'
91+fromFilePath = Identifier Nothing .
92+ intercalate "/" . filter (not . null) . split'
7493 where
7594 split' = map dropTrailingPathSeparator . splitPath
7695
@@ -78,11 +97,16 @@ fromFilePath = Identifier . intercalate "/" . filter (not . null) . split'
7897--------------------------------------------------------------------------------
7998-- | Convert an identifier to a relative 'FilePath'
8099toFilePath :: Identifier a -> FilePath
81−toFilePath = unIdentifier
100+toFilePath = identifierPath
82101
83102
84103--------------------------------------------------------------------------------
85104-- | Discard the phantom type parameter of an identifier
86105castIdentifier :: Identifier a -> Identifier b
87−castIdentifier (Identifier x) = Identifier x
106+castIdentifier (Identifier v p) = Identifier v p
88107{-# INLINE castIdentifier #-}
108+
109+
110+--------------------------------------------------------------------------------
111+setVersion :: Maybe String -> Identifier a -> Identifier a
112+setVersion v i = i {identifierVersion = v}