module Data.BBI.BigBed where
import qualified Data.ByteString as B
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.BBI
import Data.BBI.Utils
toBedRecords :: Monad m => Endianness -> Conduit B.ByteString m (Int, Int, Int, B.ByteString)
toBedRecords e = do
d <- await
case d of
Nothing -> return ()
Just bs -> go bs
where
go s | B.null s = return ()
| otherwise = do
let chr = readInt32 e . B.take 4 $ s
start = readInt32 e . B.take 4 . B.drop 4 $ s
end = readInt32 e . B.take 4 . B.drop 8 $ s
(rest, remain) = B.break (==0) . B.drop 12 $ s
yield (chr, start, end, rest)
go $ B.tail remain