Bryan O'Sullivan avatar Bryan O'Sullivan committed 7487517

Benchmark concatMap, and redefine it to not use fusion.

Comments (0)

Files changed (2)

 {-# 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

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
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.