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
- , myGetProcessID
#if __GLASGOW_HASKELL__ <= 408
, catchJust
) where
+#include "../includes/config.h"
#include "HsVersions.h"
import List ( zipWith4 )
#if __GLASGOW_HASKELL__ <= 408
import Exception ( catchIO, justIoErrors, raiseInThread )
#endif
-#ifndef mingw32_TARGET_OS
-import Posix
-#endif
+
infixr 9 `thenCmp`
\end{code}
(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}
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}
%************************************************************************
\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:
ioErrors = justIoErrors
throwTo = raiseInThread
#endif
-
-#ifdef mingw32_TARGET_OS
-foreign import "_getpid" myGetProcessID :: IO Int
-#else
-myGetProcessID :: IO Int
-myGetProcessID = Posix.getProcessID
-#endif
\end{code}