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

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

import Data.BAM.Version1_6.BAM.BAMHeader
import Data.BAM.Version1_6.BAM.BAMAlignments

import Data.Data
import Generics.Deriving.Base

-- | Custom @"BAM_V1_6_BAM"@ (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 = BAM_V1_6_BAM
  { BAM_V1_6_BAM -> Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader          :: Maybe BAM_V1_6_BAM_BAMHeader
  , BAM_V1_6_BAM -> Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments      :: Maybe BAM_V1_6_BAM_BAMAlignments
  , BAM_V1_6_BAM -> Bool
bam_v1_6_bam_endoffilemarker    :: Bool
  } deriving ((forall x. BAM_V1_6_BAM -> Rep BAM_V1_6_BAM x)
-> (forall x. Rep BAM_V1_6_BAM x -> BAM_V1_6_BAM)
-> Generic BAM_V1_6_BAM
forall x. Rep BAM_V1_6_BAM x -> BAM_V1_6_BAM
forall x. BAM_V1_6_BAM -> Rep BAM_V1_6_BAM x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BAM_V1_6_BAM -> Rep BAM_V1_6_BAM x
from :: forall x. BAM_V1_6_BAM -> Rep BAM_V1_6_BAM x
$cto :: forall x. Rep BAM_V1_6_BAM x -> BAM_V1_6_BAM
to :: forall x. Rep BAM_V1_6_BAM x -> BAM_V1_6_BAM
Generic,Typeable)

instance Eq BAM_V1_6_BAM where
  BAM_V1_6_BAM Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader1
               Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments1
               Bool
bam_v1_6_bam_endoffilemarker1 == :: BAM_V1_6_BAM -> BAM_V1_6_BAM -> Bool
==
    BAM_V1_6_BAM Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader2
                 Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments2
                 Bool
bam_v1_6_bam_endoffilemarker2 =
      Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader1          Maybe BAM_V1_6_BAM_BAMHeader
-> Maybe BAM_V1_6_BAM_BAMHeader -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe BAM_V1_6_BAM_BAMHeader
bam_v1_6_bam_bamheader2     Bool -> Bool -> Bool
&&
      Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments1      Maybe BAM_V1_6_BAM_BAMAlignments
-> Maybe BAM_V1_6_BAM_BAMAlignments -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe BAM_V1_6_BAM_BAMAlignments
bam_v1_6_bam_bamalignments2 Bool -> Bool -> Bool
&&
      Bool
bam_v1_6_bam_endoffilemarker1    Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
bam_v1_6_bam_endoffilemarker2

instance Show BAM_V1_6_BAM where
  show :: BAM_V1_6_BAM -> String
show (BAM_V1_6_BAM Maybe BAM_V1_6_BAM_BAMHeader
header
                     Maybe BAM_V1_6_BAM_BAMAlignments
alignments
                     Bool
endoffilemarker
       ) =
    String
"BAM_V1_6_BAM { "                       String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"bam_v1_6_bam_bamheader = "             String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe BAM_V1_6_BAM_BAMHeader -> String
forall a. Show a => a -> String
show Maybe BAM_V1_6_BAM_BAMHeader
header)                           String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignments = "         String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe BAM_V1_6_BAM_BAMAlignments -> String
forall a. Show a => a -> String
show Maybe BAM_V1_6_BAM_BAMAlignments
alignments)                       String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_endoffilemarker = "    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Bool -> String
forall a. Show a => a -> String
show Bool
endoffilemarker)                  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" }"