Data/Version.hs (original) (raw)
module Data.Version (
Version(..),
showVersion, parseVersion,
) where
import Prelude
#if GLASGOW_HASKELL || HUGS || NHC import Text.ParserCombinators.ReadP #else import Distribution.Compat.ReadP #endif
#if !GLASGOW_HASKELL import Data.Typeable ( Typeable, TyCon, mkTyCon, mkTyConApp ) #else import Data.Typeable ( Typeable ) #endif
import Data.List ( intersperse, sort ) import Control.Monad ( liftM ) import Data.Char ( isDigit, isAlphaNum )
data Version = Version { versionBranch :: [Int],
versionTags :: [String]
}
deriving (Read,Show #if GLASGOW_HASKELL ,Typeable #endif )
#if !GLASGOW_HASKELL versionTc :: TyCon versionTc = mkTyCon "Version"
instance Typeable Version where typeOf _ = mkTyConApp versionTc [] #endif
instance Eq Version where v1 == v2 = versionBranch v1 == versionBranch v2 && sort (versionTags v1) == sort (versionTags v2)
instance Ord Version where
v1 compare
v2 = versionBranch v1 compare
versionBranch v2
showVersion :: Version -> String showVersion (Version branch tags) = concat (intersperse "." (map show branch)) ++ concatMap ('-':) tags
#if GLASGOW_HASKELL || HUGS parseVersion :: ReadP Version #elif NHC parseVersion :: ReadPN r Version #else parseVersion :: ReadP r Version #endif parseVersion = do branch <- sepBy1 (liftM read $ munch1 isDigit) (char '.') tags <- many (char '-' >> munch1 isAlphaNum) return Version{versionBranch=branch, versionTags=tags}