Skip to content

Commit 01a2ec0

Browse files
committed
Fix bounds check, add tests
1 parent f2a3080 commit 01a2ec0

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/Data/Text/Internal/Private.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ span_ p t@(Text arr off len) = (# hd,tl #)
3434
spanEnd_ :: (Char -> Bool) -> Text -> (# Text, Text #)
3535
spanEnd_ p t@(Text arr off len) = (# hd,tl #)
3636
where hd = text arr off (k+1)
37-
tl = text arr (off+k+1) (len-k-1)
37+
tl = text arr (off+k+1) (len-(k+1))
3838
!k = loop (len-1)
39-
loop !i | i >= off && p c = loop (i+d)
40-
| otherwise = i
41-
where (c,d) = reverseIter t i
39+
loop !i | i >= 0 && p c = loop (i+d)
40+
| otherwise = i
41+
where (c,d) = reverseIter t i
4242
{-# INLINE spanEnd_ #-}
4343

4444
runText :: (forall s. (A.MArray s -> Int -> ST s Text) -> ST s Text) -> Text

tests/Tests/Properties.hs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,8 +618,14 @@ t_strip = T.dropAround isSpace `eq` T.strip
618618
tl_strip = TL.dropAround isSpace `eq` TL.strip
619619
t_splitAt n = L.splitAt n `eqP` (unpack2 . T.splitAt n)
620620
tl_splitAt n = L.splitAt n `eqP` (unpack2 . TL.splitAt (fromIntegral n))
621-
t_span p = L.span p `eqP` (unpack2 . T.span p)
622-
tl_span p = L.span p `eqP` (unpack2 . TL.span p)
621+
t_span p = L.span p `eqP` (unpack2 . T.span p)
622+
tl_span p = L.span p `eqP` (unpack2 . TL.span p)
623+
t_spanEnd p = spanEnd p `eqP` (unpack2 . T.spanEnd p)
624+
tl_spanEnd p = spanEnd p `eqP` (unpack2 . TL.spanEnd p)
625+
626+
spanEnd :: (a -> Bool) -> [a] -> ([a], [a])
627+
spanEnd p l = case span p $ reverse l of
628+
(s, e) -> (reverse e, reverse s)
623629

624630
t_breakOn_id s = squid `eq` (uncurry T.append . T.breakOn s)
625631
where squid t | T.null s = error "empty"
@@ -641,6 +647,13 @@ tl_breakOnEnd_end (NotEmpty s) t =
641647
in k `TL.isSuffixOf` t && (TL.null m || s `TL.isSuffixOf` m)
642648
t_break p = L.break p `eqP` (unpack2 . T.break p)
643649
tl_break p = L.break p `eqP` (unpack2 . TL.break p)
650+
t_breakEnd p = breakEnd p `eqP` (unpack2 . T.breakEnd p)
651+
tl_breakEnd p = breakEnd p `eqP` (unpack2 . TL.breakEnd p)
652+
653+
breakEnd :: (a -> Bool) -> [a] -> ([a], [a])
654+
breakEnd p l = case break p $ reverse l of
655+
(s, e) -> (reverse e, reverse s)
656+
644657
t_group = L.group `eqP` (map unpackS . T.group)
645658
tl_group = L.group `eqP` (map unpackS . TL.group)
646659
t_groupBy p = L.groupBy p `eqP` (map unpackS . T.groupBy p)
@@ -1264,6 +1277,8 @@ tests =
12641277
testProperty "tl_splitAt" tl_splitAt,
12651278
testProperty "t_span" t_span,
12661279
testProperty "tl_span" tl_span,
1280+
testProperty "t_spanEnd" t_spanEnd,
1281+
testProperty "tl_spanEnd" tl_spanEnd,
12671282
testProperty "t_breakOn_id" t_breakOn_id,
12681283
testProperty "tl_breakOn_id" tl_breakOn_id,
12691284
testProperty "t_breakOn_start" t_breakOn_start,
@@ -1272,6 +1287,8 @@ tests =
12721287
testProperty "tl_breakOnEnd_end" tl_breakOnEnd_end,
12731288
testProperty "t_break" t_break,
12741289
testProperty "tl_break" tl_break,
1290+
testProperty "t_breakEnd" t_breakEnd,
1291+
testProperty "tl_breakEnd" tl_breakEnd,
12751292
testProperty "t_group" t_group,
12761293
testProperty "tl_group" tl_group,
12771294
testProperty "t_groupBy" t_groupBy,

0 commit comments

Comments
 (0)