{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}

-- |
-- Module      :  Data.BAM.Version1_6.Read.Parser.BAM.Base
-- Copyright   :  (c) Matthew Mosior 2024
-- License     :  BSD-style
-- Maintainer  :  mattm.github@gmail.com
-- Portability :  portable
--
-- = Description
--
-- This library enables the decoding/encoding of SAM, BAM and CRAM file formats.

module Data.BAM.Version1_6.Read.Parser.BAM.Base ( -- * BAM_V1_6_BAM parser
                                                  parse_BAM_V1_6_BAM
                                                ) where

import Data.BAM.Version1_6.Internal
import Data.BAM.Version1_6.BAM
import Data.BAM.Version1_6.Read.Parser.BAM.BAMAlignments
import Data.BAM.Version1_6.Read.Parser.BAM.BAMHeader

import Data.Attoparsec.ByteString.Lazy as DABL

-- | Define the @"BAM_V1_6_BAM"@ parser.
parse_BAM_V1_6_BAM :: Parser BAM_V1_6_BAM
parse_BAM_V1_6_BAM :: Parser BAM_V1_6_BAM
parse_BAM_V1_6_BAM = do
  Maybe Word8
emptycdatablock <-
    Parser (Maybe Word8)
peekWord8
  case Maybe Word8
emptycdatablock of
    Maybe Word8
Nothing ->
      BAM_V1_6_BAM -> Parser BAM_V1_6_BAM
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return BAM_V1_6_BAM
               { bam_v1_6_bam_bamheader :: Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader       = Maybe BAM_V1_6_BAM_BAMHeader
forall a. Maybe a
Nothing
               , bam_v1_6_bam_bamalignments :: Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments   = Maybe BAM_V1_6_BAM_BAMAlignments
forall a. Maybe a
Nothing
               , bam_v1_6_bam_endoffilemarker :: Bool
bam_v1_6_bam_endoffilemarker = Bool
True 
               }      
    Just Word8
_ -> do
      Maybe BAM_V1_6_BAM_BAMHeader
header <-
        Parser BAM_V1_6_BAM_BAMHeader
-> Parser (Maybe BAM_V1_6_BAM_BAMHeader)
forall a. Parser a -> Parser (Maybe a)
maybeOption Parser BAM_V1_6_BAM_BAMHeader
parse_BAM_V1_6_BAM_BAMHeader
      case Maybe BAM_V1_6_BAM_BAMHeader
header of
        Maybe BAM_V1_6_BAM_BAMHeader
Nothing      -> do
          BAM_V1_6_BAM_BAMAlignments
alignments <-
            Parser BAM_V1_6_BAM_BAMAlignments
parse_BAM_V1_6_BAM_BAMAlignments
          BAM_V1_6_BAM -> Parser BAM_V1_6_BAM
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return BAM_V1_6_BAM
               { bam_v1_6_bam_bamheader :: Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader       = Maybe BAM_V1_6_BAM_BAMHeader
forall a. Maybe a
Nothing
               , bam_v1_6_bam_bamalignments :: Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments   = BAM_V1_6_BAM_BAMAlignments -> Maybe BAM_V1_6_BAM_BAMAlignments
forall a. a -> Maybe a
Just BAM_V1_6_BAM_BAMAlignments
alignments
               , bam_v1_6_bam_endoffilemarker :: Bool
bam_v1_6_bam_endoffilemarker = Bool
False
               }
        Just BAM_V1_6_BAM_BAMHeader
header' ->
          BAM_V1_6_BAM -> Parser BAM_V1_6_BAM
forall a. a -> Parser ByteString a
forall (m :: * -> *) a. Monad m => a -> m a
return BAM_V1_6_BAM
                   { bam_v1_6_bam_bamheader :: Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader       = BAM_V1_6_BAM_BAMHeader -> Maybe BAM_V1_6_BAM_BAMHeader
forall a. a -> Maybe a
Just BAM_V1_6_BAM_BAMHeader
header'
                   , bam_v1_6_bam_bamalignments :: Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments   = Maybe BAM_V1_6_BAM_BAMAlignments
forall a. Maybe a
Nothing
                   , bam_v1_6_bam_endoffilemarker :: Bool
bam_v1_6_bam_endoffilemarker = Bool
False
                   }