{-# LANGUAGE DeriveDataTypeable    #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE StrictData            #-}
{-# LANGUAGE TypeFamilies          #-}

-- |
-- Module      :  Data.BAM.Version1_6.BAM.BAMHeader
-- 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.BAM.BAMHeader ( -- * BAM_V1_6_BAM_BAMHeader version 1.6 data type
                                           BAM_V1_6_BAM_BAMHeader(..)
                                         ) where

import Data.BAM.Version1_6.BAM.ReferenceInformation

import Data.ByteString (ByteString)
import Data.Data
import Data.Sequence
import Data.Word
import Generics.Deriving.Base

-- | Custom @"BAM_V1_6_BAM_BAMHeader"@ (BAM version 1.6) data type.
--
-- See the [SAM v1.6](http://samtools.github.io/hts-specs/SAMv1.pdf) specification documentation.
data BAM_V1_6_BAM_BAMHeader = BAM_V1_6_BAM_BAMHeader
  { BAM_V1_6_BAM_BAMHeader -> ByteString
bam_v1_6_bam_bamheader_magic                 :: ByteString                             -- ^ BAM magic string (magic).
                                                                                           -- This should be BAM\1.
  , BAM_V1_6_BAM_BAMHeader -> Word32
bam_v1_6_bam_bamheader_l_text                :: Word32                                 -- ^ Length of the header text, including any NUL padding (l_text).
  , BAM_V1_6_BAM_BAMHeader -> ByteString
bam_v1_6_bam_bamheader_text                  :: ByteString                             -- ^ Plain header text in SAM;
                                                                                           -- not necessarily NUL-terminated.
  , BAM_V1_6_BAM_BAMHeader -> Word32
bam_v1_6_bam_bamheader_n_ref                 :: Word32                                 -- ^ Number of reference sequences (n_ref).
  , BAM_V1_6_BAM_BAMHeader -> Seq BAM_V1_6_BAM_Reference_Information
bam_v1_6_bam_bamheader_reference_information :: Seq BAM_V1_6_BAM_Reference_Information -- ^ List of reference information (n = bam_v1_6_bam_n_ref).
  } deriving ((forall x. BAM_V1_6_BAM_BAMHeader -> Rep BAM_V1_6_BAM_BAMHeader x)
-> (forall x.
    Rep BAM_V1_6_BAM_BAMHeader x -> BAM_V1_6_BAM_BAMHeader)
-> Generic BAM_V1_6_BAM_BAMHeader
forall x. Rep BAM_V1_6_BAM_BAMHeader x -> BAM_V1_6_BAM_BAMHeader
forall x. BAM_V1_6_BAM_BAMHeader -> Rep BAM_V1_6_BAM_BAMHeader x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BAM_V1_6_BAM_BAMHeader -> Rep BAM_V1_6_BAM_BAMHeader x
from :: forall x. BAM_V1_6_BAM_BAMHeader -> Rep BAM_V1_6_BAM_BAMHeader x
$cto :: forall x. Rep BAM_V1_6_BAM_BAMHeader x -> BAM_V1_6_BAM_BAMHeader
to :: forall x. Rep BAM_V1_6_BAM_BAMHeader x -> BAM_V1_6_BAM_BAMHeader
Generic,Typeable)

instance Eq BAM_V1_6_BAM_BAMHeader where
  BAM_V1_6_BAM_BAMHeader ByteString
bam_v1_6_bam_bamheader_magic1
                         Word32
bam_v1_6_bam_bamheader_l_text1
                         ByteString
bam_v1_6_bam_bamheader_text1
                         Word32
bam_v1_6_bam_bamheader_n_ref1
                         Seq BAM_V1_6_BAM_Reference_Information
bam_v1_6_bam_bamheader_reference_information1 == :: BAM_V1_6_BAM_BAMHeader -> BAM_V1_6_BAM_BAMHeader -> Bool
==
    BAM_V1_6_BAM_BAMHeader ByteString
bam_v1_6_bam_bamheader_magic2
                           Word32
bam_v1_6_bam_bamheader_l_text2
                           ByteString
bam_v1_6_bam_bamheader_text2
                           Word32
bam_v1_6_bam_bamheader_n_ref2
                           Seq BAM_V1_6_BAM_Reference_Information
bam_v1_6_bam_bamheader_reference_information2 =
      ByteString
bam_v1_6_bam_bamheader_magic1                 ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
bam_v1_6_bam_bamheader_magic2                         Bool -> Bool -> Bool
&&
      Word32
bam_v1_6_bam_bamheader_l_text1                Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
bam_v1_6_bam_bamheader_l_text2                        Bool -> Bool -> Bool
&&
      ByteString
bam_v1_6_bam_bamheader_text1                  ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
bam_v1_6_bam_bamheader_text2                          Bool -> Bool -> Bool
&&
      Word32
bam_v1_6_bam_bamheader_n_ref1                 Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
bam_v1_6_bam_bamheader_n_ref2                         Bool -> Bool -> Bool
&&
      Seq BAM_V1_6_BAM_Reference_Information
bam_v1_6_bam_bamheader_reference_information1 Seq BAM_V1_6_BAM_Reference_Information
-> Seq BAM_V1_6_BAM_Reference_Information -> Bool
forall a. Eq a => a -> a -> Bool
== Seq BAM_V1_6_BAM_Reference_Information
bam_v1_6_bam_bamheader_reference_information2

instance Show BAM_V1_6_BAM_BAMHeader where
  show :: BAM_V1_6_BAM_BAMHeader -> String
show (BAM_V1_6_BAM_BAMHeader ByteString
magic
                               Word32
l_text
                               ByteString
text
                               Word32
n_ref
                               Seq BAM_V1_6_BAM_Reference_Information
reference_information
       ) =
    String
"BAM_V1_6_BAM_BAMHeader { "                          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"bam_v1_6_bam_bamheader_magic = "                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (ByteString -> String
forall a. Show a => a -> String
show ByteString
magic)                                         String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_bamheader_l_text = "                String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
l_text)                                        String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_bamheader_text = "                  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (ByteString -> String
forall a. Show a => a -> String
show ByteString
text)                                          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_bamheader_n_ref = "                 String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
n_ref)                                         String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_bamheader_reference_information = " String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Seq BAM_V1_6_BAM_Reference_Information -> String
forall a. Show a => a -> String
show Seq BAM_V1_6_BAM_Reference_Information
reference_information)                         String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" }"