Copy readMaybe/readEither from base >= 4.7 for backwards compatibility
This commit is contained in:
parent
5492f0c5d1
commit
96a85fe953
@ -6,6 +6,7 @@ module Language.Haskell.GhcMod.CabalConfig (
|
|||||||
|
|
||||||
import Language.Haskell.GhcMod.GhcPkg
|
import Language.Haskell.GhcMod.GhcPkg
|
||||||
import Language.Haskell.GhcMod.Utils
|
import Language.Haskell.GhcMod.Utils
|
||||||
|
import Language.Haskell.GhcMod.Read
|
||||||
import Language.Haskell.GhcMod.Types
|
import Language.Haskell.GhcMod.Types
|
||||||
|
|
||||||
import qualified Language.Haskell.GhcMod.Cabal16 as C16
|
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.Configure (localBuildInfoFile)
|
||||||
import Distribution.Simple.LocalBuildInfo (ComponentName)
|
import Distribution.Simple.LocalBuildInfo (ComponentName)
|
||||||
import System.FilePath ((</>))
|
import System.FilePath ((</>))
|
||||||
import Text.Read (readMaybe)
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
type CabalConfig = String
|
type CabalConfig = String
|
||||||
@ -94,7 +94,7 @@ configDependencies thisPkg config = map fromInstalledPackageId deps
|
|||||||
clbi <- stripPrefix " = " field
|
clbi <- stripPrefix " = " field
|
||||||
if "Nothing" `isPrefixOf` clbi
|
if "Nothing" `isPrefixOf` clbi
|
||||||
then Nothing
|
then Nothing
|
||||||
else case readMaybe <$> stripPrefix "Just " clbi of
|
else case readMaybe =<< stripPrefix "Just " clbi of
|
||||||
Just x -> x
|
Just x -> x
|
||||||
Nothing -> error $ "reading libraryConfig failed\n" ++ show (stripPrefix "Just " clbi)
|
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
|
extract field = readConfigs field <$> extractField config field
|
||||||
|
|
||||||
readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)]
|
readConfigs :: String -> String -> [(String, C16.ComponentLocalBuildInfo)]
|
||||||
readConfigs f s = case readMaybe s of
|
readConfigs f s = case readEither s of
|
||||||
Just x -> x
|
Right x -> x
|
||||||
Nothing -> error $ "reading config " ++ f ++ " failed"
|
Left msg -> error $ "reading config " ++ f ++ " failed ("++msg++")"
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
extractField :: CabalConfig -> String -> Either String String
|
extractField :: CabalConfig -> String -> Either String String
|
||||||
extractField config field =
|
extractField config field =
|
||||||
|
106
Language/Haskell/GhcMod/Read.hs
Normal file
106
Language/Haskell/GhcMod/Read.hs
Normal file
@ -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
|
@ -79,6 +79,7 @@ Library
|
|||||||
Language.Haskell.GhcMod.PkgDoc
|
Language.Haskell.GhcMod.PkgDoc
|
||||||
Language.Haskell.GhcMod.Utils
|
Language.Haskell.GhcMod.Utils
|
||||||
Language.Haskell.GhcMod.Types
|
Language.Haskell.GhcMod.Types
|
||||||
|
Language.Haskell.GhcMod.Read
|
||||||
Build-Depends: base >= 4.0 && < 5
|
Build-Depends: base >= 4.0 && < 5
|
||||||
, containers
|
, containers
|
||||||
, deepseq
|
, deepseq
|
||||||
|
Loading…
Reference in New Issue
Block a user