[project @ 2001-05-28 03:31:19 by sof]
[ghc-hetmet.git] / ghc / compiler / utils / Util.lhs
index feea95c..423ab3f 100644 (file)
@@ -24,6 +24,9 @@ module Util (
        -- for-loop
        nTimes,
 
+       -- maybe-ish
+       unJust,
+
        -- sorting
        IF_NOT_GHC(quicksort COMMA stableSortLt COMMA mergesort COMMA)
        sortLt,
@@ -34,26 +37,21 @@ module Util (
        transitiveClosure,
 
        -- accumulating
-       mapAccumL, mapAccumR, mapAccumB, foldl2, count,
+       mapAccumL, mapAccumR, mapAccumB, 
+       foldl2, count,
 
        -- comparisons
-       thenCmp, cmpList, prefixMatch, postfixMatch,
+       thenCmp, cmpList, prefixMatch, suffixMatch,
 
        -- strictness
-       seqList, ($!),
+       foldl', seqList,
 
        -- pairs
        IF_NOT_GHC(cfst COMMA applyToPair COMMA applyToFst COMMA)
        IF_NOT_GHC(applyToSnd COMMA foldPair COMMA)
        unzipWith
 
-       -- I/O
-#if __GLASGOW_HASKELL__ < 402
-       , bracket
-#endif
-
        , global
-       , myProcessID
 
 #if __GLASGOW_HASKELL__ <= 408
        , catchJust
@@ -63,16 +61,18 @@ module Util (
 
     ) where
 
+#include "../includes/config.h"
 #include "HsVersions.h"
 
-import IO              ( hPutStrLn, stderr )
 import List            ( zipWith4 )
+import Maybe           ( Maybe(..) )
 import Panic           ( panic )
 import IOExts          ( IORef, newIORef, unsafePerformIO )
 import FastTypes
-#if __GLASGOW__HASKELL__ <= 408
+#if __GLASGOW_HASKELL__ <= 408
 import Exception       ( catchIO, justIoErrors, raiseInThread )
 #endif
+
 infixr 9 `thenCmp`
 \end{code}
 
@@ -125,6 +125,17 @@ nTimes 1 f = f
 nTimes n f = f . nTimes (n-1) f
 \end{code}
 
+%************************************************************************
+%*                                                                     *
+\subsection{Maybe-ery}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+unJust :: String -> Maybe a -> a
+unJust who (Just x) = x
+unJust who Nothing  = panic ("unJust of Nothing, called by " ++ who)
+\end{code}
 
 %************************************************************************
 %*                                                                     *
@@ -593,6 +604,16 @@ mapAccumB f a b (x:xs) = (a'',b'',y:ys)
        (a'',b',ys) = mapAccumB f a' b xs
 \end{code}
 
+A strict version of foldl.
+
+\begin{code}
+foldl'        :: (a -> b -> a) -> a -> [b] -> a
+foldl' f z xs = lgo z xs
+            where
+               lgo z []     =  z
+               lgo z (x:xs) = (lgo $! (f z x)) xs
+\end{code}
+
 A combination of foldl with zip.  It works with equal length lists.
 
 \begin{code}
@@ -640,8 +661,8 @@ prefixMatch _pat [] = False
 prefixMatch (p:ps) (s:ss) | p == s    = prefixMatch ps ss
                          | otherwise = False
 
-postfixMatch :: Eq a => [a] -> [a] -> Bool
-postfixMatch pat str = prefixMatch (reverse pat) (reverse str)
+suffixMatch :: Eq a => [a] -> [a] -> Bool
+suffixMatch pat str = prefixMatch (reverse pat) (reverse str)
 \end{code}
 
 %************************************************************************
@@ -682,29 +703,9 @@ unzipWith f pairs = map ( \ (a, b) -> f a b ) pairs
 \end{code}
 
 \begin{code}
-#if __HASKELL1__ > 4
 seqList :: [a] -> b -> b
-#else
-seqList :: (Eval a) => [a] -> b -> b
-#endif
 seqList [] b = b
 seqList (x:xs) b = x `seq` seqList xs b
-
-#if __HASKELL1__ <= 4
-($!)    :: (Eval a) => (a -> b) -> a -> b
-f $! x  = x `seq` f x
-#endif
-\end{code}
-
-\begin{code}
-#if __GLASGOW_HASKELL__ < 402
-bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
-bracket before after thing = do
-  a <- before 
-  r <- (thing a) `catch` (\err -> after a >> fail err)
-  after a
-  return r
-#endif
 \end{code}
 
 Global variables:
@@ -722,12 +723,4 @@ catchJust = catchIO
 ioErrors  = justIoErrors
 throwTo   = raiseInThread
 #endif
-
-#ifdef mingw32_TARGET_OS
-foreign import "_getpid" myProcessID :: IO Int 
-#else
-myProcessID :: IO Int
-myProcessID = do hPutStrLn stderr "Warning:myProcessID"
-                 return 12345
-#endif
 \end{code}