import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lex.Double as L
import System.Environment (getArgs)
import Text.Delimited as DT
mainInteract :: [Char] -> IO ()
mainInteract ds = do
s <- DT.interact id ds `fmap` B.getContents
case s of
Right bs -> B.putStr bs
Left e -> putStrLn ("Parse failed: " ++ e)
mainPrint :: [Char] -> IO ()
mainPrint ds = do
s <- DT.decode ds `fmap` B.getContents
case s of
Right c -> mapM_ print c
Left e -> putStrLn ("Parse failed: " ++ e)
readDouble :: Double -> BS.ByteString -> Double
readDouble d s = case L.readDouble s of
Nothing -> d
Just (a, _) -> a
mainPrintNumbers :: [Char] -> IO ()
mainPrintNumbers ds = do
s <- DT.decode ds `fmap` B.getContents
case s of
Right c -> mapM_ (print . map (readDouble 0)) c
Left e -> putStrLn ("Parse failed: " ++ e)
main :: IO ()
main = do
[cmd, ds] <- getArgs
case cmd of
"interact" -> mainInteract ds
"print" -> mainPrint ds
"printnum" -> mainPrintNumbers ds
otherwise -> putStrLn "Usage: runhaskell test.hs [interact|print|printnum] DELIMITERS < FILE"