X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Text%2FRead.hs;h=d935ffec419dfff7dda5c8b8d7b4f9e71ef0e218;hb=dc3ea0d9917409c2f1cc90a4a8d629b3ee4d4ba5;hp=16a4d158eeb701b09d543019d768c866bbc4d0e5;hpb=aaf764b3ad8b1816d68b5f27299eac125f08e1a5;p=ghc-base.git diff --git a/Text/Read.hs b/Text/Read.hs index 16a4d15..d935ffe 100644 --- a/Text/Read.hs +++ b/Text/Read.hs @@ -1,4 +1,5 @@ -{-# OPTIONS_GHC -fno-implicit-prelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude #-} + ----------------------------------------------------------------------------- -- | -- Module : Text.Read @@ -21,39 +22,80 @@ module Text.Read ( -- * The 'Read' class - Read(..), -- The Read class - ReadS, -- String -> Maybe (a,String) + Read(..), -- The Read class + ReadS, -- String -> Maybe (a,String) -- * Haskell 98 functions - reads, -- :: (Read a) => ReadS a - read, -- :: (Read a) => String -> a - readParen, -- :: Bool -> ReadS a -> ReadS a - lex, -- :: ReadS String + reads, -- :: (Read a) => ReadS a + read, -- :: (Read a) => String -> a + readParen, -- :: Bool -> ReadS a -> ReadS a + lex, -- :: ReadS String #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__) -- * New parsing functions module Text.ParserCombinators.ReadPrec, - L.Lexeme(..), - lexP, -- :: ReadPrec Lexeme + L.Lexeme(..), + lexP, -- :: ReadPrec Lexeme + parens, -- :: ReadPrec a -> ReadPrec a #endif #ifdef __GLASGOW_HASKELL__ - readListDefault, -- :: Read a => ReadS [a] - readListPrecDefault, -- :: Read a => ReadPrec [a] + readListDefault, -- :: Read a => ReadS [a] + readListPrecDefault, -- :: Read a => ReadPrec [a] #endif ) where #ifdef __GLASGOW_HASKELL__ +import GHC.Base import GHC.Read -#endif +import Data.Either +import Text.ParserCombinators.ReadP as P +#endif #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__) import Text.ParserCombinators.ReadPrec import qualified Text.Read.Lex as L -#endif +#endif #ifdef __HUGS__ -- copied from GHC.Read lexP :: ReadPrec L.Lexeme lexP = lift L.lex + +parens :: ReadPrec a -> ReadPrec a +parens p = optional + where + optional = p +++ mandatory + mandatory = do + L.Punc "(" <- lexP + x <- reset optional + L.Punc ")" <- lexP + return x #endif + +#ifdef __GLASGOW_HASKELL__ +------------------------------------------------------------------------ +-- utility functions + +-- | equivalent to 'readsPrec' with a precedence of 0. +reads :: Read a => ReadS a +reads = readsPrec minPrec + +readEither :: Read a => String -> Either String a +readEither s = + case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of + [x] -> Right x + [] -> Left "Prelude.read: no parse" + _ -> Left "Prelude.read: ambiguous parse" + where + read' = + do x <- readPrec + lift P.skipSpaces + return x + +-- | The 'read' function reads input from a string, which must be +-- completely consumed by the input process. +read :: Read a => String -> a +read s = either error id (readEither s) +#endif +