on master help sign in
Implement and test transpose
d8b8828Bryan O'Sullivan
Data/Text/Lazy.hs+10−1
@@ -57,7 +57,7 @@ module Data.Text.Lazy
57 , map
57 , map
58 , intercalate
58 , intercalate
59 , intersperse
59 , intersperse
60− -- , transpose
60+ , transpose
61 -- , reverse
61 -- , reverse
62
62
63 -- * Folds
63 -- * Folds
@@ -354,6 +354,15 @@ intersperse :: Char -> Text -> Text
354intersperse c t = unstream (S.intersperse c (stream t))
354intersperse c t = unstream (S.intersperse c (stream t))
355{-# INLINE intersperse #-}
355{-# INLINE intersperse #-}
356
356
357+-- | /O(n)/ The 'transpose' function transposes the rows and columns
358+-- of its 'Text' argument. Note that this function uses 'pack',
359+-- 'unpack', and the list version of transpose, and is thus not very
360+-- efficient.
361+transpose :: [Text] -> [Text]
362+transpose ts = L.map (\ss -> Chunk (T.pack ss) Empty)
363+ (L.transpose (L.map unpack ts))
364+-- TODO: make this fast
365+
357-- | /O(n)/ 'foldl', applied to a binary operator, a starting value
366-- | /O(n)/ 'foldl', applied to a binary operator, a starting value
358-- (typically the left-identity of the operator), and a 'Text',
367-- (typically the left-identity of the operator), and a 'Text',
359-- reduces the 'Text' using the binary operator, from left to right.
368-- reduces the 'Text' using the binary operator, from left to right.
tests/Properties.hs+2
@@ -156,6 +156,7 @@ prop_TL_intercalate c = L.intercalate c `eq` (unpackT . TL.intercalate (TL.pack
156prop_T_intersperse c = L.intersperse c `eqP` (unpackT . T.intersperse c)
156prop_T_intersperse c = L.intersperse c `eqP` (unpackT . T.intersperse c)
157prop_TL_intersperse c = L.intersperse c `eqP` (unpackT . TL.intersperse c)
157prop_TL_intersperse c = L.intersperse c `eqP` (unpackT . TL.intersperse c)
158prop_T_transpose = L.transpose `eq` (map unpackT . T.transpose . map T.pack)
158prop_T_transpose = L.transpose `eq` (map unpackT . T.transpose . map T.pack)
159+prop_TL_transpose = L.transpose `eq` (map unpackT . TL.transpose . map TL.pack)
159prop_T_reverse = L.reverse `eqP` (unpackT . T.reverse)
160prop_T_reverse = L.reverse `eqP` (unpackT . T.reverse)
160prop_T_reverse_short n = L.reverse `eqP` (unpackT . S.reverse . shorten n . S.stream)
161prop_T_reverse_short n = L.reverse `eqP` (unpackT . S.reverse . shorten n . S.stream)
161
162
@@ -385,6 +386,7 @@ tests = [
385 ("prop_T_intersperse", mytest prop_T_intersperse),
386 ("prop_T_intersperse", mytest prop_T_intersperse),
386 ("prop_TL_intersperse", mytest prop_TL_intersperse),
387 ("prop_TL_intersperse", mytest prop_TL_intersperse),
387 ("prop_T_transpose", mytest prop_T_transpose),
388 ("prop_T_transpose", mytest prop_T_transpose),
389+ ("prop_TL_transpose", mytest prop_TL_transpose),
388 ("prop_T_reverse", mytest prop_T_reverse),
390 ("prop_T_reverse", mytest prop_T_reverse),
389 ("prop_T_reverse_short", mytest prop_T_reverse_short),
391 ("prop_T_reverse_short", mytest prop_T_reverse_short),
390
392