@@ -0,0 +1,51 @@
1+-- | This benchmark sorts the lines of a file, like the @sort@ unix utility.
2+--
3+{-# LANGUAGE OverloadedStrings #-}
4+module Data.Text.Benchmarks.Programs.Sort
5+ ( benchmark
6+ ) where
7+
8+import Criterion (Benchmark, bgroup, bench)
9+import Data.Monoid (mconcat)
10+import System.IO (Handle, hPutStr)
11+import qualified Data.ByteString as B
12+import qualified Data.ByteString.Lazy as BL
13+import qualified Data.ByteString.Lazy.Char8 as BLC
14+import qualified Data.ByteString.Char8 as BC
15+import qualified Data.List as L
16+import qualified Data.Text as T
17+import qualified Data.Text.IO as T
18+import qualified Data.Text.Lazy as TL
19+import qualified Data.Text.Lazy.IO as TL
20+import qualified Data.Text.Lazy.Builder as TLB
21+
22+benchmark :: FilePath -> Handle -> IO Benchmark
23+benchmark i o = return $ bgroup "Sort"
24+ [ bench "String" $ readFile i >>= hPutStr o . string
25+ , bench "ByteString" $ B.readFile i >>= B.hPutStr o . byteString
26+ , bench "LazyByteString" $ BL.readFile i >>= BL.hPutStr o . lazyByteString
27+ , bench "Text" $ T.readFile i >>= T.hPutStr o . text
28+ , bench "LazyText" $ TL.readFile i >>= TL.hPutStr o . lazyText
29+ , bench "TextBuilder" $ T.readFile i >>= TL.hPutStr o . textBuilder
30+ ]
31+
32+string :: String -> String
33+string = unlines . L.sort . lines
34+
35+byteString :: B.ByteString -> B.ByteString
36+byteString = BC.unlines . L.sort . BC.lines
37+
38+lazyByteString :: BL.ByteString -> BL.ByteString
39+lazyByteString = BLC.unlines . L.sort . BLC.lines
40+
41+text :: T.Text -> T.Text
42+text = T.unlines . L.sort . T.lines
43+
44+lazyText :: TL.Text -> TL.Text
45+lazyText = TL.unlines . L.sort . TL.lines
46+
47+-- | Text variant using a builder monoid for the final concatenation
48+--
49+textBuilder :: T.Text -> TL.Text
50+textBuilder = TLB.toLazyText . mconcat . L.intersperse (TLB.singleton '\n') .
51+ map TLB.fromText . L.sort . T.lines