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
{-# INLINE toBedRecords #-}