on master help sign in
Implement and test lazy inits and tails
cb8194dBryan O'Sullivan
Data/Text/Lazy.hs+18−2
@@ -103,8 +103,8 @@ module Data.Text.Lazy
103 , break
103 , break
104 , group
104 , group
105 , groupBy
105 , groupBy
106− -- , inits
106+ , inits
107− -- , tails
107+ , tails
108
108
109 -- ** Breaking into many substrings
109 -- ** Breaking into many substrings
110 -- , split
110 -- , split
@@ -630,6 +630,22 @@ groupBy eq (Chunk t ts) = cons x ys : groupBy eq zs
630 x = T.unsafeHead t
630 x = T.unsafeHead t
631 xs = chunk (T.unsafeTail t) ts
631 xs = chunk (T.unsafeTail t) ts
632
632
633+-- | /O(n)/ Return all initial segments of the given 'Text',
634+-- shortest first.
635+inits :: Text -> [Text]
636+inits = (Empty :) . inits'
637+ where inits' Empty = []
638+ inits' (Chunk t ts) = L.map (\t' -> Chunk t' Empty) (L.tail (T.inits t))
639+ ++ L.map (Chunk t) (inits' ts)
640+
641+-- | /O(n)/ Return all final segments of the given 'Text', longest
642+-- first.
643+tails :: Text -> [Text]
644+tails Empty = Empty : []
645+tails ts@(Chunk t ts')
646+ | T.length t == 1 = ts : tails ts'
647+ | otherwise = ts : tails (Chunk (T.unsafeTail t) ts')
648+
633revChunks :: [T.Text] -> Text
649revChunks :: [T.Text] -> Text
634revChunks = L.foldl' (flip chunk) Empty
650revChunks = L.foldl' (flip chunk) Empty
635
651
tests/Properties.hs+4
@@ -238,7 +238,9 @@ prop_TL_group = L.group `eqP` (map unpackT . TL.group)
238prop_T_groupBy p = L.groupBy p `eqP` (map unpackT . T.groupBy p)
238prop_T_groupBy p = L.groupBy p `eqP` (map unpackT . T.groupBy p)
239prop_TL_groupBy p = L.groupBy p `eqP` (map unpackT . TL.groupBy p)
239prop_TL_groupBy p = L.groupBy p `eqP` (map unpackT . TL.groupBy p)
240prop_T_inits = L.inits `eqP` (map unpackT . T.inits)
240prop_T_inits = L.inits `eqP` (map unpackT . T.inits)
241+prop_TL_inits = L.inits `eqP` (map unpackT . TL.inits)
241prop_T_tails = L.tails `eqP` (map unpackT . T.tails)
242prop_T_tails = L.tails `eqP` (map unpackT . T.tails)
243+prop_TL_tails = L.tails `eqP` (map unpackT . TL.tails)
242
244
243prop_T_split_i c = id `eq` (T.intercalate (T.singleton c) . T.split c)
245prop_T_split_i c = id `eq` (T.intercalate (T.singleton c) . T.split c)
244
246
@@ -440,7 +442,9 @@ tests = [
440 ("prop_T_groupBy", mytest prop_T_groupBy),
442 ("prop_T_groupBy", mytest prop_T_groupBy),
441 ("prop_TL_groupBy", mytest prop_TL_groupBy),
443 ("prop_TL_groupBy", mytest prop_TL_groupBy),
442 ("prop_T_inits", mytest prop_T_inits),
444 ("prop_T_inits", mytest prop_T_inits),
445+ ("prop_TL_inits", mytest prop_TL_inits),
443 ("prop_T_tails", mytest prop_T_tails),
446 ("prop_T_tails", mytest prop_T_tails),
447+ ("prop_TL_tails", mytest prop_TL_tails),
444
448
445 ("prop_T_split_i", mytest prop_T_split_i),
449 ("prop_T_split_i", mytest prop_T_split_i),
446 ("prop_T_splitWith", mytest prop_T_splitWith),
450 ("prop_T_splitWith", mytest prop_T_splitWith),