{-# LANGUAGE DeriveDataTypeable #-} module SampleIO ( readFileCol ) where import Control.Exception.Base (Exception) import Control.Monad (liftM) import Data.Conduit (($$), ($=)) import qualified Data.Conduit as C import qualified Data.Conduit.Binary as CB import qualified Data.Conduit.List as CL import qualified Data.Conduit.Text as CT import qualified Data.Text as T import qualified Data.Text.Read as TR import Data.Typeable (Typeable) data ReadException = DoubleConversionException String deriving (Show, Typeable) instance Exception ReadException readFileCol :: String -> Int -> IO [Double] readFileCol fn col = liftM reverse $ C.runResourceT ( CB.sourceFile fn $= CB.lines $= CT.decode CT.utf8 $= CL.map (T.split (== ' ')) $= CL.map (!! col) $= toDouble $$ CL.consume ) toDouble :: C.MonadThrow m => C.Conduit T.Text m Double toDouble = CL.mapM $ \v -> case TR.double v of Left err -> C.monadThrow $ DoubleConversionException err Right (d, _) -> return d