[project @ 2005-01-11 13:44:39 by malcolm]
[ghc-base.git] / Data / Version.hs
index 959baf7..df20a4b 100644 (file)
@@ -6,7 +6,7 @@
 -- 
 -- Maintainer  :  libraries@haskell.org
 -- Stability   :  experimental
--- Portability :  portable
+-- Portability :  non-portable (local universal quantification in ReadP)
 --
 -- A general library for representation and manipulation of versions.
 -- 
@@ -30,8 +30,27 @@ module Data.Version (
        showVersion, parseVersion,
   ) where
 
+import Prelude -- necessary to get dependencies right
+
+-- These #ifdefs are necessary because this code might be compiled as
+-- part of ghc/lib/compat, and hence might be compiled by an older version
+-- of GHC.  In which case, we might need to pick up ReadP from 
+-- Distribution.Compat.ReadP, because the version in 
+-- Text.ParserCombinators.ReadP doesn't have all the combinators we need.
+#if __GLASGOW_HASKELL__ >= 603 || __HUGS__ || __NHC__
 import Text.ParserCombinators.ReadP
+#else
+import Distribution.Compat.ReadP
+#endif
+
+#if !__GLASGOW_HASKELL__
+import Data.Typeable   ( Typeable, TyCon, mkTyCon, mkTyConApp )
+#elif __GLASGOW_HASKELL__ < 602
+import Data.Dynamic    ( Typeable(..), TyCon, mkTyCon, mkAppTy )
+#else
 import Data.Typeable   ( Typeable )
+#endif
+
 import Data.List       ( intersperse )
 import Control.Monad   ( liftM )
 import Data.Char       ( isDigit, isAlphaNum )
@@ -79,7 +98,25 @@ data Version =
                -- The interpretation of the list of tags is entirely dependent
                -- on the entity that this version applies to.
        }
-  deriving (Read,Show,Typeable)
+  deriving (Read,Show
+#if __GLASGOW_HASKELL__ >= 602
+       ,Typeable
+#endif
+       )
+
+#if !__GLASGOW_HASKELL__
+versionTc :: TyCon
+versionTc = mkTyCon "Version"
+
+instance Typeable Version where
+  typeOf _ = mkTyConApp versionTc []
+#elif __GLASGOW_HASKELL__ < 602
+versionTc :: TyCon
+versionTc = mkTyCon "Version"
+
+instance Typeable Version where
+  typeOf _ = mkAppTy versionTc []
+#endif
 
 instance Eq Version where
   v1 == v2  =  versionBranch v1 == versionBranch v2 
@@ -103,7 +140,13 @@ showVersion (Version branch tags)
 
 -- | A parser for versions in the format produced by 'showVersion'.
 --
+#if __GLASGOW_HASKELL__ <= 602 && !__HUGS__ && !__NHC__
+parseVersion :: ReadP r Version
+#elif __NHC__
+parseVersion :: ReadPN r Version
+#else
 parseVersion :: ReadP Version
+#endif
 parseVersion = do branch <- sepBy1 (liftM read $ munch1 isDigit) (char '.')
                   tags   <- many (char '-' >> munch1 isAlphaNum)
                   return Version{versionBranch=branch, versionTags=tags}