on master help sign in
Implement strict takeEnd
d70ea12Bryan O'Sullivan
Data/Text.hs+14
@@ -122,6 +122,7 @@ module Data.Text
122
122
123 -- ** Breaking strings
123 -- ** Breaking strings
124 , take
124 , take
125+ , takeEnd
125 , drop
126 , drop
126 , dropEnd
127 , dropEnd
127 , takeWhile
128 , takeWhile
@@ -1018,6 +1019,19 @@ take n t@(Text arr off len)
1018 unstream (S.take n (stream t)) = take n t
1019 unstream (S.take n (stream t)) = take n t
1019 #-}
1020 #-}
1020
1021
1022+-- | /O(n)/ 'dropEnd' @n@ @t@ returns the suffix remaining after
1023+-- taking @n@ characters from the end of @t@.
1024+--
1025+-- Examples:
1026+--
1027+-- > takeEnd 3 "foobar" == "bar"
1028+takeEnd :: Int -> Text -> Text
1029+takeEnd n t@(Text arr off len)
1030+ | n <= 0 = empty
1031+ | n >= len = t
1032+ | otherwise = text arr (off+i) (len-i)
1033+ where i = iterNEnd n t
1034+
1021iterNEnd :: Int -> Text -> Int
1035iterNEnd :: Int -> Text -> Int
1022iterNEnd n t@(Text _arr _off len) = loop (len-1) n
1036iterNEnd n t@(Text _arr _off len) = loop (len-1) n
1023 where loop i !m
1037 where loop i !m
tests/Tests/Properties.hs+3
@@ -462,6 +462,8 @@ s_take_s m = L.take n `eqP` (unpackS . S.unstream . S.take n)
462sf_take p n = (L.take n . L.filter p) `eqP`
462sf_take p n = (L.take n . L.filter p) `eqP`
463 (unpackS . S.take n . S.filter p)
463 (unpackS . S.take n . S.filter p)
464t_take n = L.take n `eqP` (unpackS . T.take n)
464t_take n = L.take n `eqP` (unpackS . T.take n)
465+t_takeEnd n = (L.reverse . L.take n . L.reverse) `eqP`
466+ (unpackS . T.takeEnd n)
465tl_take n = L.take n `eqP` (unpackS . TL.take (fromIntegral n))
467tl_take n = L.take n `eqP` (unpackS . TL.take (fromIntegral n))
466s_drop n = L.drop n `eqP` (unpackS . S.drop n)
468s_drop n = L.drop n `eqP` (unpackS . S.drop n)
467s_drop_s m = L.drop n `eqP` (unpackS . S.unstream . S.drop n)
469s_drop_s m = L.drop n `eqP` (unpackS . S.unstream . S.drop n)
@@ -1060,6 +1062,7 @@ tests =
1060 testProperty "s_take_s" s_take_s,
1062 testProperty "s_take_s" s_take_s,
1061 testProperty "sf_take" sf_take,
1063 testProperty "sf_take" sf_take,
1062 testProperty "t_take" t_take,
1064 testProperty "t_take" t_take,
1065+ testProperty "t_takeEnd" t_takeEnd,
1063 testProperty "tl_take" tl_take,
1066 testProperty "tl_take" tl_take,
1064 testProperty "s_drop" s_drop,
1067 testProperty "s_drop" s_drop,
1065 testProperty "s_drop_s" s_drop_s,
1068 testProperty "s_drop_s" s_drop_s,