@@ -36,30 +36,36 @@ module Hakyll.Core.Identifier
36 , fromFilePath
36 , fromFilePath
37 , toFilePath
37 , toFilePath
38 , castIdentifier
38 , castIdentifier
42--------------------------------------------------------------------------------
44--------------------------------------------------------------------------------
43−import Control.DeepSeq (NFData)
45+import Control.Applicative ((<$>), (<*>))
46+import Control.DeepSeq (NFData (..))
44−import Data.List (intercalate)
47+import Data.List (intercalate)
45−import System.FilePath (dropTrailingPathSeparator, splitPath)
48+import System.FilePath (dropTrailingPathSeparator, splitPath)
48--------------------------------------------------------------------------------
51--------------------------------------------------------------------------------
49−import Data.Binary (Binary)
52+import Data.Binary (Binary (..))
50−import Data.Typeable (Typeable)
53+import Data.Typeable (Typeable)
51−import GHC.Exts (IsString, fromString)
54+import GHC.Exts (IsString, fromString)
54--------------------------------------------------------------------------------
57--------------------------------------------------------------------------------
55-- | An identifier used to uniquely identify a value
58-- | An identifier used to uniquely identify a value
56−newtype Identifier a = Identifier {unIdentifier :: String}
59+data Identifier a = Identifier
60+ { identifierVersion :: Maybe String
61+ , identifierPath :: String
57− deriving (Binary, Eq, NFData, Ord, Typeable)
62+ } deriving (Eq, Ord, Typeable)
60--------------------------------------------------------------------------------
65--------------------------------------------------------------------------------
61−instance Show (Identifier a) where
66+instance Binary (Identifier a) where
62− show = toFilePath
67+ put (Identifier v p) = put v >> put p
68+ get = Identifier <$> get <*> get
65--------------------------------------------------------------------------------
71--------------------------------------------------------------------------------
@@ -67,10 +73,23 @@ instance IsString (Identifier a) where
67 fromString = fromFilePath
73 fromString = fromFilePath
76+--------------------------------------------------------------------------------
77+instance NFData (Identifier a) where
78+ rnf (Identifier v p) = rnf v `seq` rnf p `seq` ()
81+--------------------------------------------------------------------------------
82+instance Show (Identifier a) where
83+ show i = case identifierVersion i of
84+ Nothing -> toFilePath i
85+ Just v -> toFilePath i ++ " (" ++ v ++ ")"
70--------------------------------------------------------------------------------
88--------------------------------------------------------------------------------
71-- | Parse an identifier from a string
89-- | Parse an identifier from a string
72fromFilePath :: String -> Identifier a
90fromFilePath :: String -> Identifier a
91+fromFilePath = Identifier Nothing .
73−fromFilePath = Identifier . intercalate "/" . filter (not . null) . split'
92+ intercalate "/" . filter (not . null) . split'
75 split' = map dropTrailingPathSeparator . splitPath
94 split' = map dropTrailingPathSeparator . splitPath
@@ -78,11 +97,16 @@ fromFilePath = Identifier . intercalate "/" . filter (not . null) . split'
78--------------------------------------------------------------------------------
97--------------------------------------------------------------------------------
79-- | Convert an identifier to a relative 'FilePath'
98-- | Convert an identifier to a relative 'FilePath'
80toFilePath :: Identifier a -> FilePath
99toFilePath :: Identifier a -> FilePath
81−toFilePath = unIdentifier
100+toFilePath = identifierPath
84--------------------------------------------------------------------------------
103--------------------------------------------------------------------------------
85-- | Discard the phantom type parameter of an identifier
104-- | Discard the phantom type parameter of an identifier
86castIdentifier :: Identifier a -> Identifier b
105castIdentifier :: Identifier a -> Identifier b
87−castIdentifier (Identifier x) = Identifier x
106+castIdentifier (Identifier v p) = Identifier v p
88{-# INLINE castIdentifier #-}
107{-# INLINE castIdentifier #-}
110+--------------------------------------------------------------------------------
111+setVersion :: Maybe String -> Identifier a -> Identifier a
112+setVersion v i = i {identifierVersion = v}