{-# LANGUAGE DeriveDataTypeable          #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleContexts            #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE MultiParamTypeClasses       #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE StrictData                  #-}
{-# LANGUAGE TypeFamilies                #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}

-- |
-- Module      :  Data.SAM.Version1_6.Alignment.OptionalFields.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.SAM.Version1_6.Alignment.OptionalFields.Base ( -- * SAM version 1.6 alignment optional data types
                                                           SAM_V1_6_Alignment_OptionalFields(..)
                                                         ) where

import Data.SAM.Version1_6.Alignment.OptionalFields.AOPT
import Data.SAM.Version1_6.Alignment.OptionalFields.IOPT
import Data.SAM.Version1_6.Alignment.OptionalFields.FOPT
import Data.SAM.Version1_6.Alignment.OptionalFields.ZOPT
import Data.SAM.Version1_6.Alignment.OptionalFields.HOPT
import Data.SAM.Version1_6.Alignment.OptionalFields.BOPT

import Data.Data
import Generics.Deriving.Base

-- | Custom SAM (version 1.6) @"SAM_V1_6_Alignment_OptionalFields"@ data type.
--
-- See section 1.4 and 1.5 of the [SAM v1.6](http://samtools.github.io/hts-specs/SAMv1.pdf) specification documentation.
data SAM_V1_6_Alignment_OptionalFields = SAM_V1_6_Alignment_OptionalFields
  { SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_AOPT -- ^ A - [!-~] - Printable characters.
  , SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_IOPT -- ^ i - [-+]?[0-9]+ - Signed integer.
  , SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_FOPT -- ^ f - [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? - Single-precision floating number.
  , SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT -- ^ Z - [ !-~]* - Printable string, including space.
  , SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_HOPT -- ^ H - ([0-9A-F][0-9A-F])* - Byte array in the Hex format.
  , SAM_V1_6_Alignment_OptionalFields
-> Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt  :: Maybe SAM_V1_6_Alignment_OptionalFields_BOPT -- ^ B - [cCsSiIf]​(,[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)* - Integer or numeric array.
  } deriving ((forall x.
 SAM_V1_6_Alignment_OptionalFields
 -> Rep SAM_V1_6_Alignment_OptionalFields x)
-> (forall x.
    Rep SAM_V1_6_Alignment_OptionalFields x
    -> SAM_V1_6_Alignment_OptionalFields)
-> Generic SAM_V1_6_Alignment_OptionalFields
forall x.
Rep SAM_V1_6_Alignment_OptionalFields x
-> SAM_V1_6_Alignment_OptionalFields
forall x.
SAM_V1_6_Alignment_OptionalFields
-> Rep SAM_V1_6_Alignment_OptionalFields x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SAM_V1_6_Alignment_OptionalFields
-> Rep SAM_V1_6_Alignment_OptionalFields x
from :: forall x.
SAM_V1_6_Alignment_OptionalFields
-> Rep SAM_V1_6_Alignment_OptionalFields x
$cto :: forall x.
Rep SAM_V1_6_Alignment_OptionalFields x
-> SAM_V1_6_Alignment_OptionalFields
to :: forall x.
Rep SAM_V1_6_Alignment_OptionalFields x
-> SAM_V1_6_Alignment_OptionalFields
Generic,Typeable)

instance Eq SAM_V1_6_Alignment_OptionalFields where
  SAM_V1_6_Alignment_OptionalFields Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt1
                                    Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt1
                                    Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt1
                                    Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt1
                                    Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt1
                                    Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt1 == :: SAM_V1_6_Alignment_OptionalFields
-> SAM_V1_6_Alignment_OptionalFields -> Bool
==
    SAM_V1_6_Alignment_OptionalFields Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt2
                                      Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt2
                                      Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt2
                                      Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt2
                                      Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt2
                                      Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt2 =
      Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt1  Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_AOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
sam_v1_6_alignment_optionalfields_aopt2  Bool -> Bool -> Bool
&&
      Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt1  Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_IOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
sam_v1_6_alignment_optionalfields_iopt2  Bool -> Bool -> Bool
&&
      Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt1  Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_FOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
sam_v1_6_alignment_optionalfields_fopt2  Bool -> Bool -> Bool
&&
      Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt1  Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
sam_v1_6_alignment_optionalfields_zopt2  Bool -> Bool -> Bool
&&
      Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt1  Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_HOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
sam_v1_6_alignment_optionalfields_hopt2  Bool -> Bool -> Bool
&&
      Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt1  Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
-> Maybe SAM_V1_6_Alignment_OptionalFields_BOPT -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
sam_v1_6_alignment_optionalfields_bopt2

instance Show SAM_V1_6_Alignment_OptionalFields where
  show :: SAM_V1_6_Alignment_OptionalFields -> String
show (SAM_V1_6_Alignment_OptionalFields Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
aopt
                                          Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
iopt
                                          Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
fopt
                                          Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
zopt
                                          Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
hopt
                                          Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
bopt
       ) =
    String
"SAM_V1_6_Alignment_OptionalFields { "          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"sam_v1_6_alignment_optionalfields_aopt = "     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    ( Maybe SAM_V1_6_Alignment_OptionalFields_AOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_AOPT
aopt)                                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , sam_v1_6_alignment_optionalfields_iopt = "  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe SAM_V1_6_Alignment_OptionalFields_IOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_IOPT
iopt)                                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , sam_v1_6_alignment_optionalfields_fopt = "  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe SAM_V1_6_Alignment_OptionalFields_FOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_FOPT
fopt)                                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , sam_v1_6_alignment_optionalfields_zopt = "  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_ZOPT
zopt)                                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , sam_v1_6_alignment_optionalfields_hopt = "  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe SAM_V1_6_Alignment_OptionalFields_HOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_HOPT
hopt)                                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , sam_v1_6_alignment_optionalfields_bopt = "  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Maybe SAM_V1_6_Alignment_OptionalFields_BOPT -> String
forall a. Show a => a -> String
show Maybe SAM_V1_6_Alignment_OptionalFields_BOPT
bopt)                                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" }"