content: module GhcMod.Read where
  
  import Text.Read (readPrec_to_S, readPrec, minPrec)
  import qualified Text.ParserCombinators.ReadP as P
  import Text.ParserCombinators.ReadPrec (lift)
  
  -- This library (libraries/base) is derived from code from several
  -- sources:
  
  --   * Code from the GHC project which is largely (c) The University of
  --     Glasgow, and distributable under a BSD-style license (see below),
  
  --   * Code from the Haskell 98 Report which is (c) Simon Peyton Jones
  --     and freely redistributable (but see the full license for
  --     restrictions).
  
  --   * Code from the Haskell Foreign Function Interface specification,
  --     which is (c) Manuel M. T. Chakravarty and freely redistributable
  --     (but see the full license for restrictions).
  
  -- The full text of these licenses is reproduced below.  All of the
  -- licenses are BSD-style or compatible.
  
  -- -----------------------------------------------------------------------------
  
  -- The Glasgow Haskell Compiler License
  
  -- Copyright 2004, The University Court of the University of Glasgow.
  -- All rights reserved.
  
  -- Redistribution and use in source and binary forms, with or without
  -- modification, are permitted provided that the following conditions are met:
  
  -- - Redistributions of source code must retain the above copyright notice,
  -- this list of conditions and the following disclaimer.
  
  -- - Redistributions in binary form must reproduce the above copyright notice,
  -- this list of conditions and the following disclaimer in the documentation
  -- and/or other materials provided with the distribution.
  
  -- - Neither name of the University nor the names of its contributors may be
  -- used to endorse or promote products derived from this software without
  -- specific prior written permission.
  
  -- THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY COURT OF THE UNIVERSITY OF
  -- GLASGOW AND THE CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  -- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  -- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  -- UNIVERSITY COURT OF THE UNIVERSITY OF GLASGOW OR THE CONTRIBUTORS BE LIABLE
  -- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  -- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  -- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  -- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  -- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  -- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  -- DAMAGE.
  
  -- -----------------------------------------------------------------------------
  
  -- Code derived from the document "Report on the Programming Language
  -- Haskell 98", is distributed under the following license:
  
  --   Copyright (c) 2002 Simon Peyton Jones
  
  --   The authors intend this Report to belong to the entire Haskell
  --   community, and so we grant permission to copy and distribute it for
  --   any purpose, provided that it is reproduced in its entirety,
  --   including this Notice.  Modified versions of this Report may also be
  --   copied and distributed for any purpose, provided that the modified
  --   version is clearly presented as such, and that it does not claim to
  --   be a definition of the Haskell 98 Language.
  
  -- -----------------------------------------------------------------------------
  
  -- Code derived from the document "The Haskell 98 Foreign Function
  -- Interface, An Addendum to the Haskell 98 Report" is distributed under
  -- the following license:
  
  --   Copyright (c) 2002 Manuel M. T. Chakravarty
  
  --   The authors intend this Report to belong to the entire Haskell
  --   community, and so we grant permission to copy and distribute it for
  --   any purpose, provided that it is reproduced in its entirety,
  --   including this Notice.  Modified versions of this Report may also be
  --   copied and distributed for any purpose, provided that the modified
  --   version is clearly presented as such, and that it does not claim to
  --   be a definition of the Haskell 98 Foreign Function Interface.
  
  -- -----------------------------------------------------------------------------
  
  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
  
  readMaybe :: Read a => String -> Maybe a
  readMaybe s = case readEither s of
                  Left _  -> Nothing
                  Right a -> Just a
  