Fusion.Common: Fix take/drop's treatment of negative counts
authorBen Gamari <ben@smart-cactus.org>
Wed, 22 Aug 2018 16:16:36 +0000 (12:16 -0400)
committerBen Gamari <ben@smart-cactus.org>
Wed, 22 Aug 2018 18:53:31 +0000 (14:53 -0400)
This fixes #227.

Data/Text/Internal/Fusion/Common.hs

index 15fbab0..f00569b 100644 (file)
@@ -735,8 +735,10 @@ unfoldrNI n f s0 | n <  0    = empty
 -- length of the stream.
 take :: Integral a => a -> Stream Char -> Stream Char
 take n0 (Stream next0 s0 len) =
-    Stream next (n0 :*: s0) (smaller len (codePointsSize $ fromIntegral n0))
+    Stream next (n0' :*: s0) (smaller len (codePointsSize $ fromIntegral n0'))
     where
+      n0' = max n0 0
+
       {-# INLINE next #-}
       next (n :*: s) | n <= 0    = Done
                      | otherwise = case next0 s of
@@ -753,8 +755,10 @@ data Drop a s = NS !s
 -- is greater than the length of the stream.
 drop :: Integral a => a -> Stream Char -> Stream Char
 drop n0 (Stream next0 s0 len) =
-    Stream next (JS n0 s0) (len - codePointsSize (fromIntegral n0))
+    Stream next (JS n0' s0) (len - codePointsSize (fromIntegral n0'))
   where
+    n0' = max n0 0
+
     {-# INLINE next #-}
     next (JS n s)
       | n <= 0    = Skip (NS s)