packages feed

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