Commits

Bryan O'Sullivan  committed 7487517

Benchmark concatMap, and redefine it to not use fusion.

  • Participants
  • Parent commits 8fe387e

Comments (0)

Files changed (2)

File Data/Text.hs

 {-# INLINE concat #-}
 
 -- | /O(n)/ Map a function over a 'Text' that results in a 'Text', and
--- concatenate the results.  Subject to fusion.
---
--- Note: if in 'concatMap' @f@ @t@, @f@ is defined in terms of fusible
--- functions, it will also be fusible.
+-- concatenate the results.
 concatMap :: (Char -> Text) -> Text -> Text
-concatMap f t = unstream (S.concatMap (stream . f) (stream t))
+concatMap f = concat . foldr ((:) . f) []
 {-# INLINE concatMap #-}
 
 -- | /O(n)/ 'any' @p@ @t@ determines whether any character in the

File tests/Benchmarks.hs

       , bench "b8" $ nf B8.concat sl
       , bench "list" $ nf L.concat ll
       ],
+      bgroup "concatMap" [
+        bench "text" $ nf (T.concatMap (T.replicate 3 . T.singleton)) t0
+      , bench "b8" $ nf (B8.concatMap (B8.replicate 3)) s0
+      , bench "list" $ nf (L.concatMap (L.replicate 3 . (:[]))) l0
+      ],
       bgroup "decode" [
         bench "text" $ nf decodeUtf8 s0
       , bench "b8" $ nf B8.unpack s0