module Bio.SeqLoc.ZeptoUtils
where
import Control.Applicative
import qualified Data.ByteString as BSW
import qualified Data.ByteString.Char8 as BS
import Data.ByteString.Internal (c2w)
import qualified Data.Attoparsec.Char8 as AP (isDigit_w8)
import qualified Data.Attoparsec.Zepto as ZP
import Bio.SeqLoc.Strand
strand :: ZP.Parser Strand
strand = ((ZP.string "+\t" *> return Fwd) <|>
(ZP.string "-\t" *> return RevCompl))
decfield :: (Integral a) => ZP.Parser a
decfield = decimal <* ZP.string "\t"
field :: ZP.Parser BS.ByteString
field = ZP.takeWhile (/= c2w '\t') <* ZP.string "\t"
dropField :: ZP.Parser ()
dropField = ZP.takeWhile (/= c2w '\t') *> ZP.string "\t" *> return ()
decimal :: (Integral a) => ZP.Parser a
decimal = decode <$> ZP.takeWhile (AP.isDigit_w8)
where decode = fromIntegral . BSW.foldl' step (0 :: Int)
step a w = a * 10 + fromIntegral (w 48)