-- for-loop
nTimes,
+ -- maybe-ish
+ unJust,
+
-- sorting
IF_NOT_GHC(quicksort COMMA stableSortLt COMMA mergesort COMMA)
sortLt,
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
+#if __GLASGOW_HASKELL__ <= 408
+ , catchJust
+ , ioErrors
+ , throwTo
+#endif
+
) where
+#include "../includes/config.h"
#include "HsVersions.h"
import List ( zipWith4 )
+import Maybe ( Maybe(..) )
import Panic ( panic )
import IOExts ( IORef, newIORef, unsafePerformIO )
import FastTypes
+#if __GLASGOW_HASKELL__ <= 408
+import Exception ( catchIO, justIoErrors, raiseInThread )
+#endif
infixr 9 `thenCmp`
\end{code}
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}
%************************************************************************
%* *
(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:
global a = unsafePerformIO (newIORef a)
\end{code}
+Compatibility stuff:
+
+\begin{code}
+#if __GLASGOW_HASKELL__ <= 408
+catchJust = catchIO
+ioErrors = justIoErrors
+throwTo = raiseInThread
+#endif
+\end{code}