{-# LANGUAGE DeriveDataTypeable          #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleContexts            #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE MultiParamTypeClasses       #-}
{-# LANGUAGE OverloadedLists             #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE MultiWayIf                  #-}
{-# LANGUAGE PackageImports              #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}
{-# Language QuasiQuotes                 #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}

-- |
-- Module      :  Data.SAM.Version1_6.Read.Parser.Alignment.Base
-- Copyright   :  (c) Matthew Mosior 2023
-- License     :  BSD-style
-- Maintainer  :  mattm.github@gmail.com
-- Portability :  portable
--
-- = WARNING
--
-- This module is considered __internal__.
--
-- The Package Versioning Policy __does not apply__.
--
-- The contents of this module may change __in any way whatsoever__
-- and __without any warning__ between minor versions of this package.
--
-- Authors importing this library are expected to track development
-- closely.
--
-- All credit goes to the author(s)/maintainer(s) of the
-- [containers](https://hackage.haskell.org/package/containers) library
-- for the above warning text.
--
-- = Description
--
-- This library enables the decoding/encoding of SAM, BAM and CRAM file formats.

module Data.SAM.Version1_6.Read.Parser.Alignment.Base ( -- * SAM_V1_6 parser - alignment section
                                                        parse_SAM_V1_6_Alignment
                                                      ) where

import Data.SAM.Version1_6.Alignment
import Data.SAM.Version1_6.Read.Error
import Data.SAM.Version1_6.Read.Parser.Alignment.AOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.IOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.FOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.ZOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.HOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.BOPT

import           Control.Applicative.Permutations           (intercalateEffect,toPermutationWithDefault)
import           Data.Attoparsec.ByteString.Char8  as DABC8 (endOfLine,isEndOfLine)
import           Data.Attoparsec.ByteString.Lazy   as DABL
import qualified Data.ByteString.Char8             as DBC8
import           Text.Regex.PCRE.Heavy

-- | @"SAM_V1_6_Alignment"@ parser.
--
-- Defines a parser for the alignment section of the SAM v1.6 file format.
--
-- See the [SAM v1.6](http://samtools.github.io/hts-specs/SAMv1.pdf) specification documentation.
parse_SAM_V1_6_Alignment :: Parser SAM_V1_6_Alignment
parse_SAM_V1_6_Alignment :: Parser SAM_V1_6_Alignment
parse_SAM_V1_6_Alignment = do
  ByteString
qname <- do ByteString
qnamep <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
              -- Parse QNAME field of alignment section.
              case (ByteString
qnamep ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[!-?A-~]{1,254}|\*|]) of
                Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_QNAME_Incorrect_Format
                Bool
True  -> -- QNAME is in the accepted format.
                         ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
qnamep
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
flag <- do ByteString
flagp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
             -- Parse FLAG field of alignment section.
             case (ByteString
flagp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[0-9]+|]) of
               Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_FLAG_Incorrect_Format
               Bool
True  -> -- FLAG is in the accepted format.
                        ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
flagp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
rname <- do ByteString
rnamep <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
              -- Parse RNAME field of alignment section.
              case (ByteString
rnamep ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|\*|[0-9A-Za-z!#$%&+.:;?@^_|~-][0-9A-Za-z!#$%&*+.:;=?@^_|~-]*|]) of
                Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_RNAME_Incorrect_Format 
                Bool
True  -> -- RNAME is in the accepted format.
                         ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
rnamep
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
pos <- do ByteString
posp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
            -- Parse POS field of the alignment section.
            case (ByteString
posp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[0-9]+|]) of
              Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_POS_Incorrect_Format
              Bool
True  -> -- POS is in the accepted format.
                       ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
posp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
mapq <- do ByteString
mapqp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
             -- Parse MAPQ field of the alignment section.
             case (ByteString
mapqp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[0-9]+|]) of
               Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_MAPQ_Incorrect_Format
               Bool
True  -> -- MAPQ is in the accepted format.
                        ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
mapqp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
cigar <- do ByteString
cigarp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
              -- Parse CIGAR field of alignment section.
              case (ByteString
cigarp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|\*|([0-9]+[MIDNSHPX=])+|]) of
                Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_CIGAR_Incorrect_Format
                Bool
True  -> -- CIGAR is in the accepted format.
                         ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
cigarp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
rnext <- do ByteString
rnextp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
              -- Parse RNEXT field of the alignment section.
              case (ByteString
rnextp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|\*|=|[0-9A-Za-z!#$%&+.:;?@^_|~-][0-9A-Za-z!#$%&*+.:;=?@^_|~-]*|]) of
                Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_RNEXT_Incorrect_Format
                Bool
True  -> -- RNEXT is in the accepted format.
                         ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
rnextp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
pnext <- do ByteString
pnextp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
              -- Parse PNEXT field of the alignment section.
              case (ByteString
pnextp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[0-9]+|]) of
                Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_PNEXT_Incorrect_Format
                Bool
True  -> -- PNEXT is in the accepted format.
                         ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
pnextp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
tlen <- do ByteString
tlenp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
             -- Parse TLEN field of the alignment section.
             case (ByteString
tlenp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[-]?[0-9]+|]) of
               Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_TLEN_Incorrect_Format 
               Bool
True  -> -- TLEN is in the accepted format.
                        ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
tlenp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
seq <- do ByteString
seqp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09)
            -- Parse SEQ field of the alignment section.
            case (ByteString
seqp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|\*|[A-Za-z=.]+|]) of
              Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_SEQ_Incorrect_Format 
              Bool
True  -> -- SEQ is in the accepted format.
                       ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
seqp
  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
  ByteString
qual <- do ByteString
qualp <- (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill (\Word8
x -> Word8
x Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
09 Bool -> Bool -> Bool
|| Word8 -> Bool
isEndOfLine Word8
x)
             -- Parse QUAL field of the alignment section.
             case (ByteString
qualp ByteString -> Regex -> Bool
forall a. ConvertibleStrings a ByteString => a -> Regex -> Bool
=~ [re|[!-~?]+|\*|]) of
               Bool
False -> String -> Parser ByteString ByteString
forall a. String -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser ByteString ByteString)
-> String -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$ SAM_V1_6_Error -> String
forall a. Show a => a -> String
show SAM_V1_6_Error
SAM_V1_6_Error_Alignment_QUAL_Incorrect_Format
               Bool
True  -> -- QUAL is in the accepted format.
                        ByteString -> Parser ByteString ByteString
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return ByteString
qualp 
  Maybe Word8
optfields <- Parser (Maybe Word8)
peekWord8
  case Maybe Word8
optfields of
    Just Word8
10 -> do -- Return the parsed SAM_V1_6.
                  ()
_ <- Parser ()
endOfLine
                  SAM_V1_6_Alignment -> Parser SAM_V1_6_Alignment
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return SAM_V1_6_Alignment { sam_v1_6_alignment_qname :: ByteString
sam_v1_6_alignment_qname  = ByteString
qname
                                            , sam_v1_6_alignment_flag :: Int
sam_v1_6_alignment_flag   = case (ByteString -> Maybe (Int, ByteString)
DBC8.readInt ByteString
flag) of
                                                                            Maybe (Int, ByteString)
Nothing          -> (-Int
1)
                                                                            Just (Int
flagint,ByteString
_) -> Int
flagint
                                            , sam_v1_6_alignment_rname :: ByteString
sam_v1_6_alignment_rname = ByteString
rname
                                            , sam_v1_6_alignment_pos :: Integer
sam_v1_6_alignment_pos   = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
pos) of
                                                                           Maybe (Integer, ByteString)
Nothing             -> Integer
0
                                                                           Just (Integer
posinteger,ByteString
_) -> Integer
posinteger
                                            , sam_v1_6_alignment_mapq :: Int
sam_v1_6_alignment_mapq  = case (ByteString -> Maybe (Int, ByteString)
DBC8.readInt ByteString
mapq) of
                                                                           Maybe (Int, ByteString)
Nothing          -> Int
255
                                                                           Just (Int
mapqint,ByteString
_) -> Int
mapqint
                                            , sam_v1_6_alignment_cigar :: ByteString
sam_v1_6_alignment_cigar = ByteString
cigar
                                            , sam_v1_6_alignment_rnext :: ByteString
sam_v1_6_alignment_rnext = ByteString
rnext
                                            , sam_v1_6_alignment_pnext :: Integer
sam_v1_6_alignment_pnext = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
pnext) of
                                                                           Maybe (Integer, ByteString)
Nothing               -> Integer
0
                                                                           Just (Integer
pnextinteger,ByteString
_) -> Integer
pnextinteger
                                            , sam_v1_6_alignment_tlen :: Integer
sam_v1_6_alignment_tlen  = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
tlen) of
                                                                           Maybe (Integer, ByteString)
Nothing              -> Integer
0
                                                                           Just (Integer
tleninteger,ByteString
_) -> Integer
tleninteger
                                            , sam_v1_6_alignment_seq :: ByteString
sam_v1_6_alignment_seq   = ByteString
seq
                                            , sam_v1_6_alignment_qual :: ByteString
sam_v1_6_alignment_qual  = ByteString
qual
                                            , sam_v1_6_alignment_aopt :: Maybe ByteString
sam_v1_6_alignment_aopt  = Maybe ByteString
forall a. Maybe a
Nothing
                                            , sam_v1_6_alignment_iopt :: Maybe Integer
sam_v1_6_alignment_iopt  = Maybe Integer
forall a. Maybe a
Nothing
                                            , sam_v1_6_alignment_fopt :: Maybe Float
sam_v1_6_alignment_fopt  = Maybe Float
forall a. Maybe a
Nothing
                                            , sam_v1_6_alignment_zopt :: Maybe ByteString
sam_v1_6_alignment_zopt  = Maybe ByteString
forall a. Maybe a
Nothing
                                            , sam_v1_6_alignment_hopt :: Maybe (Seq Word8)
sam_v1_6_alignment_hopt  = Maybe (Seq Word8)
forall a. Maybe a
Nothing
                                            , sam_v1_6_alignment_bopt :: Maybe SAM_V1_6_Alignment_BOPT
sam_v1_6_alignment_bopt  = Maybe SAM_V1_6_Alignment_BOPT
forall a. Maybe a
Nothing
                                            }
    Maybe Word8
_       -> do -- This parser assumes that
                  -- the AOPT, IOPT, FOPT, ZOPT, HOPT, and BOPT
                  -- tags can appear in any order.
                  Word8
_ <- Word8 -> Parser Word8
word8 Word8
09
                  (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields <- Parser Word8
-> Permutation
     (Parser ByteString)
     (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
      Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
-> Parser
     ByteString
     (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
      Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
forall (m :: * -> *) b a.
Alternative m =>
m b -> Permutation m a -> m a
intercalateEffect (Word8 -> Parser Word8
word8 Word8
09) (Permutation
   (Parser ByteString)
   (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
    Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
 -> Parser
      ByteString
      (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation
     (Parser ByteString)
     (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
      Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
-> Parser
     ByteString
     (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
      Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
forall a b. (a -> b) -> a -> b
$
                                      (,,,,,)
                                        (Maybe ByteString
 -> Maybe Integer
 -> Maybe Float
 -> Maybe ByteString
 -> Maybe (Seq Word8)
 -> Maybe SAM_V1_6_Alignment_BOPT
 -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
     Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe ByteString)
-> Permutation
     (Parser ByteString)
     (Maybe Integer
      -> Maybe Float
      -> Maybe ByteString
      -> Maybe (Seq Word8)
      -> Maybe SAM_V1_6_Alignment_BOPT
      -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
          Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe ByteString
-> Parser ByteString (Maybe ByteString)
-> Permutation (Parser ByteString) (Maybe ByteString)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe ByteString
forall a. Maybe a
Nothing
                                                                     (ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> Parser ByteString ByteString
-> Parser ByteString (Maybe ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString ByteString
parse_SAM_V1_6_Alignment_AOPT)
                                        Permutation
  (Parser ByteString)
  (Maybe Integer
   -> Maybe Float
   -> Maybe ByteString
   -> Maybe (Seq Word8)
   -> Maybe SAM_V1_6_Alignment_BOPT
   -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe Integer)
-> Permutation
     (Parser ByteString)
     (Maybe Float
      -> Maybe ByteString
      -> Maybe (Seq Word8)
      -> Maybe SAM_V1_6_Alignment_BOPT
      -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
          Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
forall a b.
Permutation (Parser ByteString) (a -> b)
-> Permutation (Parser ByteString) a
-> Permutation (Parser ByteString) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Integer
-> Parser ByteString (Maybe Integer)
-> Permutation (Parser ByteString) (Maybe Integer)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe Integer
forall a. Maybe a
Nothing
                                                                     (Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer)
-> Parser ByteString Integer -> Parser ByteString (Maybe Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Integer
parse_SAM_V1_6_Alignment_IOPT)
                                        Permutation
  (Parser ByteString)
  (Maybe Float
   -> Maybe ByteString
   -> Maybe (Seq Word8)
   -> Maybe SAM_V1_6_Alignment_BOPT
   -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe Float)
-> Permutation
     (Parser ByteString)
     (Maybe ByteString
      -> Maybe (Seq Word8)
      -> Maybe SAM_V1_6_Alignment_BOPT
      -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
          Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
forall a b.
Permutation (Parser ByteString) (a -> b)
-> Permutation (Parser ByteString) a
-> Permutation (Parser ByteString) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Float
-> Parser ByteString (Maybe Float)
-> Permutation (Parser ByteString) (Maybe Float)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe Float
forall a. Maybe a
Nothing
                                                                     (Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Maybe Float)
-> Parser ByteString Float -> Parser ByteString (Maybe Float)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString Float
parse_SAM_V1_6_Alignment_FOPT)
                                        Permutation
  (Parser ByteString)
  (Maybe ByteString
   -> Maybe (Seq Word8)
   -> Maybe SAM_V1_6_Alignment_BOPT
   -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe ByteString)
-> Permutation
     (Parser ByteString)
     (Maybe (Seq Word8)
      -> Maybe SAM_V1_6_Alignment_BOPT
      -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
          Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
forall a b.
Permutation (Parser ByteString) (a -> b)
-> Permutation (Parser ByteString) a
-> Permutation (Parser ByteString) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe ByteString
-> Parser ByteString (Maybe ByteString)
-> Permutation (Parser ByteString) (Maybe ByteString)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe ByteString
forall a. Maybe a
Nothing
                                                                     (ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> Parser ByteString ByteString
-> Parser ByteString (Maybe ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString ByteString
parse_SAM_V1_6_Alignment_ZOPT)
                                        Permutation
  (Parser ByteString)
  (Maybe (Seq Word8)
   -> Maybe SAM_V1_6_Alignment_BOPT
   -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe (Seq Word8))
-> Permutation
     (Parser ByteString)
     (Maybe SAM_V1_6_Alignment_BOPT
      -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
          Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
forall a b.
Permutation (Parser ByteString) (a -> b)
-> Permutation (Parser ByteString) a
-> Permutation (Parser ByteString) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Seq Word8)
-> Parser ByteString (Maybe (Seq Word8))
-> Permutation (Parser ByteString) (Maybe (Seq Word8))
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe (Seq Word8)
forall a. Maybe a
Nothing
                                                                     (Seq Word8 -> Maybe (Seq Word8)
forall a. a -> Maybe a
Just (Seq Word8 -> Maybe (Seq Word8))
-> Parser ByteString (Seq Word8)
-> Parser ByteString (Maybe (Seq Word8))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString (Seq Word8)
parse_SAM_V1_6_Alignment_HOPT)
                                        Permutation
  (Parser ByteString)
  (Maybe SAM_V1_6_Alignment_BOPT
   -> (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
       Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT))
-> Permutation (Parser ByteString) (Maybe SAM_V1_6_Alignment_BOPT)
-> Permutation
     (Parser ByteString)
     (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
      Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
forall a b.
Permutation (Parser ByteString) (a -> b)
-> Permutation (Parser ByteString) a
-> Permutation (Parser ByteString) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe SAM_V1_6_Alignment_BOPT
-> Parser ByteString (Maybe SAM_V1_6_Alignment_BOPT)
-> Permutation (Parser ByteString) (Maybe SAM_V1_6_Alignment_BOPT)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe SAM_V1_6_Alignment_BOPT
forall a. Maybe a
Nothing
                                                                     (SAM_V1_6_Alignment_BOPT -> Maybe SAM_V1_6_Alignment_BOPT
forall a. a -> Maybe a
Just (SAM_V1_6_Alignment_BOPT -> Maybe SAM_V1_6_Alignment_BOPT)
-> Parser ByteString SAM_V1_6_Alignment_BOPT
-> Parser ByteString (Maybe SAM_V1_6_Alignment_BOPT)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString SAM_V1_6_Alignment_BOPT
parse_SAM_V1_6_Alignment_BOPT)
                  ()
_ <- Parser ()
endOfLine 
                  -- Return the parsed SAM_V1_6.
                  SAM_V1_6_Alignment -> Parser SAM_V1_6_Alignment
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return SAM_V1_6_Alignment { sam_v1_6_alignment_qname :: ByteString
sam_v1_6_alignment_qname  = ByteString
qname
                                            , sam_v1_6_alignment_flag :: Int
sam_v1_6_alignment_flag   = case (ByteString -> Maybe (Int, ByteString)
DBC8.readInt ByteString
flag) of
                                                                            Maybe (Int, ByteString)
Nothing          -> (-Int
1)
                                                                            Just (Int
flagint,ByteString
_) -> Int
flagint
                                            , sam_v1_6_alignment_rname :: ByteString
sam_v1_6_alignment_rname = ByteString
rname
                                            , sam_v1_6_alignment_pos :: Integer
sam_v1_6_alignment_pos   = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
pos) of
                                                                           Maybe (Integer, ByteString)
Nothing             -> Integer
0
                                                                           Just (Integer
posinteger,ByteString
_) -> Integer
posinteger
                                            , sam_v1_6_alignment_mapq :: Int
sam_v1_6_alignment_mapq  = case (ByteString -> Maybe (Int, ByteString)
DBC8.readInt ByteString
mapq) of
                                                                           Maybe (Int, ByteString)
Nothing          -> Int
255
                                                                           Just (Int
mapqint,ByteString
_) -> Int
mapqint
                                            , sam_v1_6_alignment_cigar :: ByteString
sam_v1_6_alignment_cigar = ByteString
cigar
                                            , sam_v1_6_alignment_rnext :: ByteString
sam_v1_6_alignment_rnext = ByteString
rnext
                                            , sam_v1_6_alignment_pnext :: Integer
sam_v1_6_alignment_pnext = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
pnext) of
                                                                           Maybe (Integer, ByteString)
Nothing               -> Integer
0
                                                                           Just (Integer
pnextinteger,ByteString
_) -> Integer
pnextinteger
                                            , sam_v1_6_alignment_tlen :: Integer
sam_v1_6_alignment_tlen  = case (ByteString -> Maybe (Integer, ByteString)
DBC8.readInteger ByteString
tlen) of
                                                                           Maybe (Integer, ByteString)
Nothing              -> Integer
0
                                                                           Just (Integer
tleninteger,ByteString
_) -> Integer
tleninteger
                                            , sam_v1_6_alignment_seq :: ByteString
sam_v1_6_alignment_seq   = ByteString
seq
                                            , sam_v1_6_alignment_qual :: ByteString
sam_v1_6_alignment_qual  = ByteString
qual
                                            , sam_v1_6_alignment_aopt :: Maybe ByteString
sam_v1_6_alignment_aopt  = (\(Maybe ByteString
a,Maybe Integer
_,Maybe Float
_,Maybe ByteString
_,Maybe (Seq Word8)
_,Maybe SAM_V1_6_Alignment_BOPT
_) -> Maybe ByteString
a) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            , sam_v1_6_alignment_iopt :: Maybe Integer
sam_v1_6_alignment_iopt  = (\(Maybe ByteString
_,Maybe Integer
i,Maybe Float
_,Maybe ByteString
_,Maybe (Seq Word8)
_,Maybe SAM_V1_6_Alignment_BOPT
_) -> Maybe Integer
i) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            , sam_v1_6_alignment_fopt :: Maybe Float
sam_v1_6_alignment_fopt  = (\(Maybe ByteString
_,Maybe Integer
_,Maybe Float
f,Maybe ByteString
_,Maybe (Seq Word8)
_,Maybe SAM_V1_6_Alignment_BOPT
_) -> Maybe Float
f) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            , sam_v1_6_alignment_zopt :: Maybe ByteString
sam_v1_6_alignment_zopt  = (\(Maybe ByteString
_,Maybe Integer
_,Maybe Float
_,Maybe ByteString
z,Maybe (Seq Word8)
_,Maybe SAM_V1_6_Alignment_BOPT
_) -> Maybe ByteString
z) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            , sam_v1_6_alignment_hopt :: Maybe (Seq Word8)
sam_v1_6_alignment_hopt  = (\(Maybe ByteString
_,Maybe Integer
_,Maybe Float
_,Maybe ByteString
_,Maybe (Seq Word8)
h,Maybe SAM_V1_6_Alignment_BOPT
_) -> Maybe (Seq Word8)
h) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            , sam_v1_6_alignment_bopt :: Maybe SAM_V1_6_Alignment_BOPT
sam_v1_6_alignment_bopt  = (\(Maybe ByteString
_,Maybe Integer
_,Maybe Float
_,Maybe ByteString
_,Maybe (Seq Word8)
_,Maybe SAM_V1_6_Alignment_BOPT
b) -> Maybe SAM_V1_6_Alignment_BOPT
b) (Maybe ByteString, Maybe Integer, Maybe Float, Maybe ByteString,
 Maybe (Seq Word8), Maybe SAM_V1_6_Alignment_BOPT)
optionalfields
                                            }