module Biobase.ExtSS.Import where
import Control.Applicative (pure)
import Data.ByteString.Char8 as BS
import Data.Iteratee as I
import Data.Iteratee.Char as I
import Data.Iteratee.IO as I
import Data.Iteratee.ListLike as I
import Prelude as P hiding (sequence)
import Data.Char (isSpace)
import Biobase.ExtSS
eneeExtSS :: (Monad m) => Enumeratee ByteString [ExtSS] m a
eneeExtSS = enumLinesBS ><> convStream f where
f = do
cs <- I.break (not . isPrefixOf "#")
seq <- I.head
str <- I.head
xs <- I.break (not . isPrefixOf " ")
return . pure $ ExtSS
{ sequence = seq
, structure = str
, detailed = P.map convLine xs
, comments = P.map (BS.drop 1) cs
}
convLine :: ByteString -> (Int,Int,ByteString)
convLine x
| Just (i,s) <- readInt $ BS.dropWhile isSpace x
, Just (j,t) <- readInt $ BS.dropWhile isSpace s
= (i,j,BS.dropWhile isSpace t)
| otherwise = error $ "can not parse line: " ++ unpack x
fromFile :: FilePath -> IO [ExtSS]
fromFile fp = run =<< ( enumFile 8192 fp
. joinI
$ eneeExtSS stream2list
)