estreps-0.1: src/Unigene.hs
-- read a clustering on Unigene format
-- each cluster separated by '^#.*$'
module Unigene (ugRead) where
import Control.Monad
import System.IO
import qualified Data.ByteString.Lazy.Char8 as B
import Bio.Sequence (Sequence(..))
import Bio.Sequence.Fasta (mkSeqs)
import Data.List (groupBy)
-- Isn't this lazy?
ugRead :: FilePath -> IO [[Sequence]]
ugRead f = do
s <- B.readFile f
let ls = dropWhile B.null $ B.lines $ s
when (B.head (head ls) /= '#') (hPutStrLn stderr ("Warning: '"++f++"' does not look like Unigene format"))
return (clusters $ ls)
clusters :: [B.ByteString] -> [[Sequence]]
clusters (l:ls) = let ls' = if B.head l == '#' then (l:ls) else (B.pack "# dummy UG hdr" :l:ls)
ss = groupBy (const (('#' /=) . B.head)) $ filter (not . B.null) ls'
in map (mkSeqs . tail) ss