{-# LANGUAGE FlexibleContexts #-} module Bio.Data.Bam ( Bam , HeaderState , runBam , readBam , writeBam , bamToBed ) where import Bio.Data.Bed import Bio.HTS import Bio.HTS.Types (Bam, FileHeader (..)) import Conduit import Control.Monad.State (get, lift) bamToBed :: Conduit Bam HeaderState BED bamToBed = mapMC f =$= concatC where f bam = do BamHeader hdr <- lift get case getChr hdr bam of Just chr -> let start = fromIntegral $ position bam end = fromIntegral $ endPos bam nm = Just $ qName bam strand = Just $ not $ isRev bam in return $ Just $ BED chr start end nm Nothing strand _ -> return Nothing {-# INLINE bamToBed #-} {- viewBam :: IdxHandle -> (B.ByteString, Int, Int) -> Source IO Bam1 viewBam handle (chr, s, e) = case lookupTarget (idxHeader handle) chr of Nothing -> return () Just chrId -> do q <- lift $ query handle chrId (fromIntegral s,fromIntegral e) go q where go q' = do r <- lift $ next q' case r of Nothing -> return () Just bam -> yield bam >> go q' {-# INLINE viewBam #-} -}