diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2020-08-10 09:20:03 +0200 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-08-10 20:24:09 -0400 |
commit | acf537f9fefa31883b7cb28ff61b837ab7f8a44a (patch) | |
tree | f6579140c148f329d47b5ad65eb94c4bf96fb2b8 /compiler/GHC/Utils | |
parent | 1c4692641dcaca3e90116c28d012c506108b386f (diff) | |
download | haskell-acf537f9fefa31883b7cb28ff61b837ab7f8a44a.tar.gz |
Make splitAtList strict in its arguments
Also fix its slightly wrong comment
Metric Decrease:
T5030
T12227
T12545
Diffstat (limited to 'compiler/GHC/Utils')
-rw-r--r-- | compiler/GHC/Utils/Misc.hs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/compiler/GHC/Utils/Misc.hs b/compiler/GHC/Utils/Misc.hs index 1d827e7902..50ac5dc9e8 100644 --- a/compiler/GHC/Utils/Misc.hs +++ b/compiler/GHC/Utils/Misc.hs @@ -6,6 +6,7 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE MagicHash #-} {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} @@ -774,15 +775,18 @@ dropList _ xs@[] = xs dropList (_:xs) (_:ys) = dropList xs ys --- | Given two lists xs=x0..xn and ys=y0..ym, return `splitAt n ys`. +-- | Given two lists xs and ys, return `splitAt (length xs) ys`. splitAtList :: [b] -> [a] -> ([a], [a]) -splitAtList xs ys = go 0 xs ys +splitAtList xs ys = go 0# xs ys where -- we are careful to avoid allocating when there are no leftover -- arguments: in this case we can return "ys" directly (cf #18535) - go _ _ [] = (ys, []) -- len(ys) <= len(xs) - go n [] bs = (take n ys, bs) -- = splitAt n ys - go n (_:as) (_:bs) = go (n+1) as bs + -- + -- We make `xs` strict because in the general case `ys` isn't `[]` so we + -- will have to evaluate `xs` anyway. + go _ !_ [] = (ys, []) -- length ys <= length xs + go n [] bs = (take (I# n) ys, bs) -- = splitAt n ys + go n (_:as) (_:bs) = go (n +# 1#) as bs -- drop from the end of a list dropTail :: Int -> [a] -> [a] |