From 96a85fe953986a8e3e14e161a9200d1390eda7fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gr=C3=B6ber?= Date: Sat, 10 May 2014 13:36:54 +0200 Subject: [PATCH] Copy readMaybe/readEither from base >= 4.7 for backwards compatibility --- Language/Haskell/GhcMod/CabalConfig.hs | 16 ++-- Language/Haskell/GhcMod/Read.hs | 106 +++++++++++++++++++++++++ ghc-mod.cabal | 1 + 3 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 Language/Haskell/GhcMod/Read.hs diff --git a/Language/Haskell/GhcMod/CabalConfig.hs b/Language/Haskell/GhcMod/CabalConfig.hs index 75dc525..93e6e37 100644 --- a/Language/Haskell/GhcMod/CabalConfig.hs +++ b/Language/Haskell/GhcMod/CabalConfig.hs @@ -6,6 +6,7 @@ module Language.Haskell.GhcMod.CabalConfig ( import Language.Haskell.GhcMod.GhcPkg import Language.Haskell.GhcMod.Utils +import Language.Haskell.GhcMod.Read import Language.Haskell.GhcMod.Types import qualified Language.Haskell.GhcMod.Cabal16 as C16 @@ -24,7 +25,6 @@ import Distribution.Simple.BuildPaths (defaultDistPref) import Distribution.Simple.Configure (localBuildInfoFile) import Distribution.Simple.LocalBuildInfo (ComponentName) import System.FilePath (()) -import Text.Read (readMaybe) ---------------------------------------------------------------- type CabalConfig = String @@ -94,7 +94,7 @@ configDependencies thisPkg config = map fromInstalledPackageId deps clbi <- stripPrefix " = " field if "Nothing" `isPrefixOf` clbi then Nothing - else case readMaybe <$> stripPrefix "Just " clbi of + else case readMaybe =<< stripPrefix "Just " clbi of Just x -> x Nothing -> error $ "reading libraryConfig failed\n" ++ show (stripPrefix "Just " clbi) @@ -102,15 +102,9 @@ configDependencies thisPkg config = map fromInstalledPackageId deps extract field = readConfigs field <$> extractField config field readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)] - readConfigs f s = case readMaybe s of - Just x -> x - Nothing -> error $ "reading config " ++ f ++ " failed" - - -readEither :: Read r => String -> Either String r -readEither s = case readMaybe s of - Just x -> Right x - Nothing -> Left $ "read: failed on input:\n" ++ s + readConfigs f s = case readEither s of + Right x -> x + Left msg -> error $ "reading config " ++ f ++ " failed ("++msg++")" extractField :: CabalConfig -> String -> Either String String extractField config field = diff --git a/Language/Haskell/GhcMod/Read.hs b/Language/Haskell/GhcMod/Read.hs new file mode 100644 index 0000000..21b5b65 --- /dev/null +++ b/Language/Haskell/GhcMod/Read.hs @@ -0,0 +1,106 @@ +module Language.Haskell.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 diff --git a/ghc-mod.cabal b/ghc-mod.cabal index c043128..bfc2659 100644 --- a/ghc-mod.cabal +++ b/ghc-mod.cabal @@ -79,6 +79,7 @@ Library Language.Haskell.GhcMod.PkgDoc Language.Haskell.GhcMod.Utils Language.Haskell.GhcMod.Types + Language.Haskell.GhcMod.Read Build-Depends: base >= 4.0 && < 5 , containers , deepseq