{-# OPTIONS_GHC -fno-warn-orphans #-}

module Bio.FASTA.Parser
  ( fastaP
  , fastaPGeneric
  , fastaLine 
  , modificationP
  ) where

import Bio.FASTA.Type       (Fasta, FastaItem (..), ModItem (..), Modification (..),
                             ParsableFastaToken (..))
import Bio.Sequence         (BareSequence, bareSequence)
import Control.Applicative  ((<|>))
import Data.Attoparsec.Text (Parser, char, choice, endOfInput, endOfLine, many', many1', satisfy,
                             skipWhile, space, string, takeWhile, try)
import Data.Char            (isAlphaNum, isLetter, isSpace)
import Data.Text            (Text, strip)
import Prelude              hiding (takeWhile)

instance ParsableFastaToken Char where
    parseToken :: (Char -> Bool) -> Parser Char
parseToken = (Char -> Bool) -> Parser Char
satisfy

instance ParsableFastaToken ModItem where
    parseToken :: (Char -> Bool) -> Parser ModItem
parseToken Char -> Bool
predicate = (Modification -> ModItem
Mod (Modification -> ModItem)
-> Parser Text Modification -> Parser ModItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Modification
modificationP) Parser ModItem -> Parser ModItem -> Parser ModItem
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Char -> ModItem
Letter (Char -> ModItem) -> Parser Char -> Parser ModItem
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> Parser Char
satisfy Char -> Bool
predicate)


-- | Parser of .fasta file.
--
fastaP :: ParsableFastaToken a => Parser (Fasta a)
fastaP :: Parser (Fasta a)
fastaP = Parser Char -> Parser Text [Char]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many' Parser Char
space Parser Text [Char] -> Parser (Fasta a) -> Parser (Fasta a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Char -> Bool) -> Parser (Fasta a)
forall a.
ParsableFastaToken a =>
(Char -> Bool) -> Parser (Fasta a)
fastaPGeneric Char -> Bool
isLetter

fastaPGeneric :: ParsableFastaToken a => (Char -> Bool) -> Parser (Fasta a)
fastaPGeneric :: (Char -> Bool) -> Parser (Fasta a)
fastaPGeneric = Parser Text (FastaItem a) -> Parser (Fasta a)
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many' (Parser Text (FastaItem a) -> Parser (Fasta a))
-> ((Char -> Bool) -> Parser Text (FastaItem a))
-> (Char -> Bool)
-> Parser (Fasta a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> Parser Text (FastaItem a)
forall a.
ParsableFastaToken a =>
(Char -> Bool) -> Parser (FastaItem a)
item

item :: ParsableFastaToken a => (Char -> Bool) -> Parser (FastaItem a)
item :: (Char -> Bool) -> Parser (FastaItem a)
item Char -> Bool
predicate = (Text -> BareSequence a -> FastaItem a
forall a. Text -> BareSequence a -> FastaItem a
FastaItem (Text -> BareSequence a -> FastaItem a)
-> Parser Text Text -> Parser Text (BareSequence a -> FastaItem a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Text
seqName Parser Text (BareSequence a -> FastaItem a)
-> Parser Text (BareSequence a) -> Parser (FastaItem a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Char -> Bool) -> Parser Text (BareSequence a)
forall a.
ParsableFastaToken a =>
(Char -> Bool) -> Parser (BareSequence a)
fastaSeq Char -> Bool
predicate) Parser (FastaItem a) -> Parser Text () -> Parser (FastaItem a)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (Char -> Bool) -> Parser Text ()
skipWhile Char -> Bool
isSpace

seqName :: Parser Text
seqName :: Parser Text Text
seqName = Text -> Text
strip (Text -> Text) -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Parser Char
char Char
'>' Parser Char -> Parser Text () -> Parser Text ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser Text ()
tabs Parser Text () -> Parser Text Text -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Char -> Bool) -> Parser Text Text
takeWhile (Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Char
'\n', Char
'\r']) Parser Text Text -> Parser Text () -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
tabs Parser Text Text -> Parser Text () -> Parser Text Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
eol)

fastaSeq :: ParsableFastaToken a => (Char -> Bool) -> Parser (BareSequence a)
fastaSeq :: (Char -> Bool) -> Parser (BareSequence a)
fastaSeq Char -> Bool
predicate = [a] -> BareSequence a
forall s. IsBareSequence s => [Element s] -> s
bareSequence ([a] -> BareSequence a)
-> ([[a]] -> [a]) -> [[a]] -> BareSequence a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[a]] -> [a]
forall a. Monoid a => [a] -> a
mconcat ([[a]] -> BareSequence a)
-> Parser Text [[a]] -> Parser (BareSequence a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text [a] -> Parser Text [[a]]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many' ((Char -> Bool) -> Parser Text [a]
forall a. ParsableFastaToken a => (Char -> Bool) -> Parser [a]
fastaLine Char -> Bool
predicate)

fastaLine :: ParsableFastaToken a => (Char -> Bool) -> Parser [a]
fastaLine :: (Char -> Bool) -> Parser [a]
fastaLine Char -> Bool
predicate = [[a]] -> [a]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[a]] -> [a]) -> Parser Text [[a]] -> Parser [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser [a] -> Parser Text [[a]]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many1' (Parser Text a -> Parser [a]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many1' ((Char -> Bool) -> Parser Text a
forall a. ParsableFastaToken a => (Char -> Bool) -> Parser a
parseToken Char -> Bool
predicate) Parser [a] -> Parser Text [Char] -> Parser [a]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Char -> Parser Text [Char]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many' (Char -> Parser Char
char Char
' ')) Parser [a] -> Parser Text () -> Parser [a]
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
eol

eol :: Parser ()
eol :: Parser Text ()
eol = Parser Text ()
tabs Parser Text () -> Parser Text () -> Parser Text ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> [Parser Text ()] -> Parser Text ()
forall (f :: * -> *) a. Alternative f => [f a] -> f a
choice [Parser Text ()
slashN, Parser Text ()
forall t. Chunk t => Parser t ()
endOfInput]

slashN :: Parser ()
slashN :: Parser Text ()
slashN = () () -> Parser Text [()] -> Parser Text ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser Text () -> Parser Text [()]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many1' Parser Text ()
endOfLine

tabs :: Parser ()
tabs :: Parser Text ()
tabs = () () -> Parser Text [Char] -> Parser Text ()
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Parser Char -> Parser Text [Char]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many' (Char -> Parser Char
char Char
'\t')

modificationP :: Parser Modification
modificationP :: Parser Text Modification
modificationP 
  =   Text -> Parser Text Text
string Text
"[A*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_A_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[C*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_C_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[G*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_G_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[T*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_T_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rU]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rU
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[+A]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_Plus_A
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[+C]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_Plus_C
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[+G]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_Plus_G
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[+T]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_Plus_T
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rAf]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rAf
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rCf]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rCf
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rGf]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rGf
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[rUf]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_rUf
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mU]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mU
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mA*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mA_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mC*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mC_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mG*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mG_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[mU*]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_mU_Star
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[dU]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_dU
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5Bio]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5Bio
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[iBio]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_iBio
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[56FAM]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_56FAM
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[36FAM]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_36FAM
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5HEX]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5HEX
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5TMR]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5TMR
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3BHQ1]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3BHQ1
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3BHQ2]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3BHQ2
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5NH2]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5NH2
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3NH2]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3NH2
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5PO4]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5PO4
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3PO4]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3PO4
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3BioTEG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3BioTEG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[C12]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_C12
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[NHSdT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_NHSdT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5Mal]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5Mal
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5thio]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5thio
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3thio]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3thio
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3azide]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3azide
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3alkine]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3alkine
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5CholTEG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5CholTEG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[3CholTEG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_3CholTEG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5C10]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5C10
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[5Alk]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_5Alk
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AAA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AAA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AAC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AAC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[ACT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_ACT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[ATC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_ATC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[ATG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_ATG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CAG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CAG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[AGA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_AGA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CAT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CAT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CCG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CCG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CGT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CGT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[CTG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_CTG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GAA]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GAA
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GAC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GAC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GCT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GCT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GGT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GGT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[GTT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_GTT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TAC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TAC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TCT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TCT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TGC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TGC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TGG]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TGG
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TTC]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TTC
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Text -> Parser Text Text
string Text
"[TTT]" Parser Text Text
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure Modification
Mod_TTT
  Parser Text Modification
-> Parser Text Modification -> Parser Text Modification
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Text Modification
unknownP

unknownP :: Parser Modification
unknownP :: Parser Text Modification
unknownP = Parser Text Modification -> Parser Text Modification
forall i a. Parser i a -> Parser i a
try (Parser Text Modification -> Parser Text Modification)
-> Parser Text Modification -> Parser Text Modification
forall a b. (a -> b) -> a -> b
$ do
    Char
_ <- Char -> Parser Char
char Char
'[' 
    [Char]
m <- Parser Char -> Parser Text [Char]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many1' (Parser Char -> Parser Text [Char])
-> Parser Char -> Parser Text [Char]
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> Parser Char
satisfy (\Char
c -> Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Char
'+', Char
'-', Char
'*', Char
'_'])
    Char
_ <- Char -> Parser Char
char Char
']'
    Modification -> Parser Text Modification
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Modification -> Parser Text Modification)
-> Modification -> Parser Text Modification
forall a b. (a -> b) -> a -> b
$ [Char] -> Modification
Unknown ([Char]
"[" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
m [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"]")