{-# LANGUAGE OverloadedStrings #-} 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 Plus) <|> (ZP.string "-\t" *> return Minus)) 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)