X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FMaybes.lhs;h=b29dd9c56454180f445f305127474df36e0c90c2;hb=fd85674c9539d4f182e94526e4fbf0d0e32a8271;hp=c996439a08a849a2edb82dd62a12d49fecde0c76;hpb=b505fcd55ff104195c35625781e0903b1a9ac5bf;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/Maybes.lhs b/ghc/compiler/utils/Maybes.lhs index c996439..b29dd9c 100644 --- a/ghc/compiler/utils/Maybes.lhs +++ b/ghc/compiler/utils/Maybes.lhs @@ -4,9 +4,7 @@ \section[Maybes]{The `Maybe' types and associated utility functions} \begin{code} -#if defined(COMPILING_GHC) #include "HsVersions.h" -#endif module Maybes ( -- Maybe(..), -- no, it's in 1.3 @@ -26,32 +24,17 @@ module Maybes ( seqMaybe, returnMaB, returnMaybe, - thenMaB - -#if defined(COMPILING_GHC) - , catMaybes -#else - , findJust - , foldlMaybeErrs - , listMaybeErrs -#endif + thenMaB, + catMaybes ) where -#if defined(COMPILING_GHC) +CHK_Ubiq() -- debugging consistency check +import Unique (Unique) -- only for specialising -CHK_Ubiq() -- debugging consistency check - -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201 -IMPORT_DELOOPER( SpecLoop ) -- Specialisation -#else -import {-# SOURCE #-} Name +#if __GLASGOW_HASKELL__ >= 204 +import Maybe( catMaybes, mapMaybe ) #endif -import Unique (Unique) -- only for specialising - -#else -import Maybe -- renamer will tell us if there are any conflicts -#endif \end{code} @@ -73,13 +56,6 @@ a list of @Justs@ into a single @Just@, returning @Nothing@ if there are any @Nothings@. \begin{code} -#ifdef COMPILING_GHC -catMaybes :: [Maybe a] -> [a] -catMaybes [] = [] -catMaybes (Nothing : xs) = catMaybes xs -catMaybes (Just x : xs) = (x : catMaybes xs) -#endif - allMaybes :: [Maybe a] -> Maybe [a] allMaybes [] = Just [] allMaybes (Nothing : ms) = Nothing @@ -87,11 +63,19 @@ allMaybes (Just x : ms) = case (allMaybes ms) of Nothing -> Nothing Just xs -> Just (x:xs) +#if __GLASGOW_HASKELL__ < 204 + -- After 2.04 we get these from the library Maybe +catMaybes :: [Maybe a] -> [a] +catMaybes [] = [] +catMaybes (Nothing : xs) = catMaybes xs +catMaybes (Just x : xs) = (x : catMaybes xs) + mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe f [] = [] mapMaybe f (x:xs) = case f x of Just y -> y : mapMaybe f xs Nothing -> mapMaybe f xs +#endif \end{code} @firstJust@ takes a list of @Maybes@ and returns the @@ -148,13 +132,11 @@ assocMaybe alist key lookup [] = Nothing lookup ((tv,ty):rest) = if key == tv then Just ty else lookup rest -#if defined(COMPILING_GHC) {-# SPECIALIZE assocMaybe :: [(FAST_STRING, b)] -> FAST_STRING -> Maybe b , [(Int, b)] -> Int -> Maybe b , [(Unique, b)] -> Unique -> Maybe b #-} -#endif \end{code} @mkLookupFun eq alist@ is a function which looks up @@ -208,38 +190,3 @@ returnMaB v = Succeeded v failMaB :: err -> MaybeErr val err failMaB e = Failed e \end{code} - - -@listMaybeErrs@ takes a list of @MaybeErrs@ and, if they all succeed, returns -a @Succeeded@ of a list of their values. If any fail, it returns a -@Failed@ of the list of all the errors in the list. - -\begin{code} -listMaybeErrs :: [MaybeErr val err] -> MaybeErr [val] [err] -listMaybeErrs - = foldr combine (Succeeded []) - where - combine (Succeeded v) (Succeeded vs) = Succeeded (v:vs) - combine (Failed err) (Succeeded _) = Failed [err] - combine (Succeeded v) (Failed errs) = Failed errs - combine (Failed err) (Failed errs) = Failed (err:errs) -\end{code} - -@foldlMaybeErrs@ works along a list, carrying an accumulator; it -applies the given function to the accumulator and the next list item, -accumulating any errors that occur. - -\begin{code} -foldlMaybeErrs :: (acc -> input -> MaybeErr acc err) - -> acc - -> [input] - -> MaybeErr acc [err] - -foldlMaybeErrs k accum ins = do_it [] accum ins - where - do_it [] acc [] = Succeeded acc - do_it errs acc [] = Failed errs - do_it errs acc (v:vs) = case (k acc v) of - Succeeded acc' -> do_it errs acc' vs - Failed err -> do_it (err:errs) acc vs -\end{code}