Commit acf537f9 authored by Sylvain Henry's avatar Sylvain Henry Committed by Marge Bot
Browse files

Make splitAtList strict in its arguments

Also fix its slightly wrong comment

Metric Decrease:
    T5030
    T12227
    T12545
parent 1c469264
Pipeline #23247 failed with stages
in 312 minutes and 54 seconds
......@@ -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]
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment