{-# OPTIONS_GHC -fno-warn-orphans #-}
module Bio.NucleicAcid.Nucleotide.Instances () where
import Bio.NucleicAcid.Nucleotide.Type
import Bio.Utils.Monomer (FromSymbol (..), Symbol (..))
import Data.Array (Array, listArray)
import Data.String (IsString (..))
instance Symbol DNA where
symbol DA = 'A'
symbol DC = 'C'
symbol DG = 'G'
symbol DT = 'T'
instance FromSymbol DNA where
fromSymbolE 'A' = Right DA
fromSymbolE 'C' = Right DC
fromSymbolE 'G' = Right DG
fromSymbolE 'T' = Right DT
fromSymbolE ch = Left ch
instance Symbol RNA where
symbol RA = 'A'
symbol RC = 'C'
symbol RG = 'G'
symbol RU = 'U'
instance FromSymbol RNA where
fromSymbolE 'A' = Right RA
fromSymbolE 'C' = Right RC
fromSymbolE 'G' = Right RG
fromSymbolE 'U' = Right RU
fromSymbolE ch = Left ch
instance {-# OVERLAPPING #-} IsString [DNA] where
fromString s =
case traverse fromSymbolE s of
Right l -> l
Left e -> error $ "Bio.NucleicAcid.Nucleotide.Instances: could not read nucleotide " <> [e]
instance IsString (Array Int DNA) where
fromString s = listArray (0, length s - 1) $ fromString s
instance {-# OVERLAPPING #-} IsString [RNA] where
fromString s =
case traverse fromSymbolE s of
Right l -> l
Left e -> error $ "Bio.NucleicAcid.Nucleotide.Instances: could not read nucleotide " <> [e]
instance IsString (Array Int RNA) where
fromString s = listArray (0, length s - 1) $ fromString s