    {-# LANGUAGE CPP, NoImplicitPrelude #-}
    module Text.Read.Compat (
       -- * The 'Read' class
       Read(..),
       ReadS,

       -- * Haskell 2010 functions
       reads,
       read,
       readParen,
       lex,

       -- * New parsing functions
       module Text.ParserCombinators.ReadPrec,
       L.Lexeme(..),
       lexP,
       parens,
       readListDefault,
       readListPrecDefault,
       readEither,
       readMaybe

     ) where

    import Text.Read
    import Text.ParserCombinators.ReadPrec
    import qualified Text.Read.Lex as L

    #if !(MIN_VERSION_base(4,6,0))
    import Prelude.Compat
    import qualified Text.ParserCombinators.ReadP as P

    -- | Parse a string using the 'Read' instance.
    -- Succeeds if there is exactly one valid result.
    -- A 'Left' value indicates a parse error.
    --
    -- /Since: 4.6.0.0/
    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

    -- | Parse a string using the 'Read' instance.
    -- Succeeds if there is exactly one valid result.
    --
    -- /Since: 4.6.0.0/
    readMaybe :: Read a => String -> Maybe a
    readMaybe s = case readEither s of
                    Left _  -> Nothing
                    Right a -> Just a
    #endif