on master help sign in
Add a silly number reading benchmark

--HG-- extra : convert_revision : 888c66eb9a4aadffbdbb2911bc6238f3ac19c71f

commite50d43bec8cace78551c9744a9057b78ebe56f5d authorBryan O'Sullivan <bos@serpentine.com> dateSat 9 Oct 2010, 00:11 (16 years ago) parent135a061
1 file changed+49
tests/benchmarks/ReadNumbers.hs+49
tests/benchmarks/ReadNumbers.hsnew file+49
@@ -0,0 +1,49 @@
1+import Debug.Trace
2+import Control.Monad
3+import Data.List
4+import qualified Data.Text.Lex as T
5+import qualified Data.Text.IO as T
6+import qualified Data.Text as T
7+import System.Environment
8+
9+dec = T.signed T.decimal :: T.Lexer Int
10+
11+hex = T.signed T.hexadecimal :: T.Lexer Int
12+
13+double = T.double :: T.Lexer Double
14+
15+def = dec
16+
17+read1 :: Num a => T.Lexer a -> T.Text -> a
18+read1 reader = foldl' go 0 . T.lines
19+ where go z t = case reader t of
20+ Left err -> error err
21+ Right (n,_) -> n
22+
23+--paranoid :: T.Text -> [(Double)]
24+paranoid = foldr go [] . T.lines
25+ where go t xs = let a = case T.double t of
26+ Left err -> error err
27+ Right (n,_) -> n
28+ b = case T.rational t of
29+ Left err -> error err
30+ Right (n,_) -> n
31+ in if a /= b
32+ then abs ((a-b)/a) : xs
33+ else xs
34+
35+read2 :: Num a => T.Lexer a -> T.Text -> a
36+read2 reader = go
37+ where
38+ go t
39+ | T.null t = 0
40+ | otherwise = case reader t of
41+ Left err -> error err
42+ Right (n,t') -> case T.uncons t' of
43+ Nothing -> n
44+ Just (_,t'') -> go t''
45+
46+main = do
47+ args <- getArgs
48+ (print . read2 def) =<< T.getContents
49+ --mapM_ print =<< paranoid `fmap` T.getContents