{-# LANGUAGE DeriveDataTypeable          #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleContexts            #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE MultiParamTypeClasses       #-}
{-# LANGUAGE OverloadedLists             #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE MultiWayIf                  #-}
{-# 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 2024
-- 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.Alignment.OptionalFields.Base
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.AOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.IOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.FOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.ZOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.HOPT
import Data.SAM.Version1_6.Read.Parser.Alignment.OptionalFields.BOPT

import           Data.Attoparsec.ByteString.Char8  as DABC8 (endOfLine,isEndOfLine)
import           Data.Attoparsec.ByteString.Lazy   as DABL
import qualified Data.ByteString                   as DB
import qualified Data.ByteString.Char8             as DBC8
import           Data.List                         as DL    (intercalate)
import           Data.Sequence                     as DSeq  (empty,Seq(..))
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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 ->
        [Char] -> Parser ByteString ByteString
forall a. [Char] -> Parser ByteString a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser ByteString ByteString)
-> [Char] -> Parser ByteString ByteString
forall a b. (a -> b) -> a -> b
$
          SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
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_optionalfields :: Maybe (Seq SAM_V1_6_Alignment_OptionalFields)
sam_v1_6_alignment_optionalfields = Maybe (Seq SAM_V1_6_Alignment_OptionalFields)
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
      ByteString
optionalfieldsbytes <-
        (Word8 -> Bool) -> Parser ByteString ByteString
DABL.takeTill Word8 -> Bool
isEndOfLine
      Seq SAM_V1_6_Alignment_OptionalFields
optionalfields      <-
        Seq SAM_V1_6_Alignment_OptionalFields
-> Parser ByteString (Seq SAM_V1_6_Alignment_OptionalFields)
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return (Seq SAM_V1_6_Alignment_OptionalFields
 -> Parser ByteString (Seq SAM_V1_6_Alignment_OptionalFields))
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Parser ByteString (Seq SAM_V1_6_Alignment_OptionalFields)
forall a b. (a -> b) -> a -> b
$
          ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ByteString
optionalfieldsbytes
      ()
_                   <-
        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_optionalfields :: Maybe (Seq SAM_V1_6_Alignment_OptionalFields)
sam_v1_6_alignment_optionalfields = Seq SAM_V1_6_Alignment_OptionalFields
-> Maybe (Seq SAM_V1_6_Alignment_OptionalFields)
forall a. a -> Maybe a
Just Seq SAM_V1_6_Alignment_OptionalFields
optionalfields
                                }
  where
    parse_OptionalFields :: DB.ByteString
                         -> Seq SAM_V1_6_Alignment_OptionalFields
    parse_OptionalFields :: ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ByteString
bs = do
      case ByteString -> Bool
DB.null ByteString
bs of
        Bool
True  ->
          Seq SAM_V1_6_Alignment_OptionalFields
forall a. Seq a
DSeq.empty
        Bool
False ->
          case ByteString -> Int -> Maybe Word8
DB.indexMaybe ByteString
bs Int
3 of
            Maybe Word8
Nothing   ->
              [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Index_Missing
            -- AOPT <-> 'A'
            Just Word8
0x41 ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_AOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_AOPT
parse_SAM_V1_6_Alignment_OptionalFields_AOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing AOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_AOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = SAM_V1_6_Alignment_OptionalFields_AOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_AOPT
parsedbs
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Maybe a
Nothing
                        }
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                        ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                                       (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                                    ByteString
bs
                                             )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            -- IOPT <-> 'i'
            Just Word8
0x69 ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_IOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_IOPT
parse_SAM_V1_6_Alignment_OptionalFields_IOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing IOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_IOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = SAM_V1_6_Alignment_OptionalFields_IOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_IOPT
parsedbs
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Maybe a
Nothing
                        }
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                      ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                               (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                            ByteString
bs
                                           )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            -- FOPT <-> 'f'
            Just Word8
0x66 ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_FOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_FOPT
parse_SAM_V1_6_Alignment_OptionalFields_FOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing FOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_FOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = SAM_V1_6_Alignment_OptionalFields_FOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_FOPT
parsedbs
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Maybe a
Nothing
                        }                      
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                      ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                               (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                            ByteString
bs
                                           )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            -- ZOPT <-> 'Z'
            Just Word8
0x5A ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_ZOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_ZOPT
parse_SAM_V1_6_Alignment_OptionalFields_ZOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing ZOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_ZOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = SAM_V1_6_Alignment_OptionalFields_ZOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_ZOPT
parsedbs
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Maybe a
Nothing
                        }
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                      ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                               (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                            ByteString
bs
                                           )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            -- HOPT <-> 'H'
            Just Word8
0x48 ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_HOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_HOPT
parse_SAM_V1_6_Alignment_OptionalFields_HOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing HOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_HOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = SAM_V1_6_Alignment_OptionalFields_HOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_HOPT
parsedbs
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Maybe a
Nothing
                        }
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                      ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                               (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                            ByteString
bs
                                           )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            -- BOPT <-> 'B'
            Just Word8
0x42 ->
              case ( Parser SAM_V1_6_Alignment_OptionalFields_BOPT
-> ByteString -> Result SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. Parser a -> ByteString -> Result a
DABL.parse Parser SAM_V1_6_Alignment_OptionalFields_BOPT
parse_SAM_V1_6_Alignment_OptionalFields_BOPT
                                ( ByteString -> ByteString
DB.fromStrict (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                    (Word8 -> Bool) -> ByteString -> ByteString
DB.takeWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                 ByteString
bs
                                )
                   ) of
                Fail ByteString
_
                     [[Char]]
ctxs
                     [Char]
err ->
                  [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error  ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                    [Char] -> [Char]
forall a. Show a => a -> [Char]
show ([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$ [Char]
"Error while parsing BOPT field." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Parsing contexts: "              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           ([Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
", " [[Char]]
ctxs)           [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"\n"                              [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
"Error message: "                 [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
                           [Char]
err
                Done ByteString
remainingbytes
                     SAM_V1_6_Alignment_OptionalFields_BOPT
parsedbs -> do
                  let strictremainingbytes :: ByteString
strictremainingbytes = ByteString -> ByteString
DB.toStrict ByteString
remainingbytes
                  case ByteString -> Bool
DB.null ByteString
strictremainingbytes of
                    Bool
True  ->
                      SAM_V1_6_Alignment_OptionalFields
                        { sam_v1_6_alignment_optionalfields_aopt :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  = Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_iopt :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  = Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_fopt :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  = Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_zopt :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  = Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_hopt :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  = Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
forall a. Maybe a
Nothing
                        , sam_v1_6_alignment_optionalfields_bopt :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  = SAM_V1_6_Alignment_OptionalFields_BOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
forall a. a -> Maybe a
Just SAM_V1_6_Alignment_OptionalFields_BOPT
parsedbs
                        }
                      SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
-> Seq SAM_V1_6_Alignment_OptionalFields
forall a. a -> Seq a -> Seq a
DSeq.:<|
                      ByteString -> Seq SAM_V1_6_Alignment_OptionalFields
parse_OptionalFields ( Int -> ByteString -> ByteString
DB.drop Int
1 (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$
                                               (Word8 -> Bool) -> ByteString -> ByteString
DB.dropWhile (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word8
0x09)
                                                            ByteString
bs
                                           )
                    Bool
False ->
                      [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                        SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_Remaining_Bytes
            Maybe Word8
_    ->
              [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a. HasCallStack => [Char] -> a
error ([Char] -> Seq SAM_V1_6_Alignment_OptionalFields)
-> [Char] -> Seq SAM_V1_6_Alignment_OptionalFields
forall a b. (a -> b) -> a -> b
$
                SAM_V1_6_Error -> [Char]
forall a. Show a => a -> [Char]
show SAM_V1_6_Error
SAM_V1_6_Read_Error_Alignment_OptionalFields_BOPT_Missing_Type